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或如果你有问题。 玩的开心 :)