Q承诺:如何顺序尝试多个registry

我可能需要一些关于node.js应用程序的Q promise的帮助。 我的用例如下:

  • 我们需要find(通过ID)一些信息(说一个命令)
  • 我们有多个存储库可能包含的信息(目录,数据库,nosql,REST服务…)
  • 我们有一个search序列。 也就是说,我们不希望以平行和最快的速度search所有的数据,但是我们需要依次search一个数据库
  • find信息后,我们可以停止search并忽略剩余的存储库
  • 我们已经对每个存储库都有承诺

我正在努力的是创造/返回一个承诺,完成时,信息被发现。

像(伪代码):

var deferred = Q.defer(id) foreach repo in repositories { var p = repo.findById(id) .then deferred.resolve(order) p.waitForThePromiseToFinish if (p.success) break } 

一个想法如何实现这一点? 任何帮助表示赞赏。

非常像你的伪代码,除非我们使用可靠的链接,因为动作是asynchronous的:

 var p = Promise.resolve(); // start empty promise; repositories.forEach(function(repo){ p = p.then(function(result){ // chain if(result.success) return result; // assumes that result.success is true if good return repo.findById(id); // call find by Id }); }); 

这将parsing为承诺p ,这将成为第一个成功的存储库,或者如果全部失败,则拒绝 – 请注意,这假定您的findById API是这样的,它返回一个带有result.success === true的值,和result.success === false否则返回result.success === false 。 让我知道如果你有问题适应你的实际API或如果你有问题。 玩的开心 :)