Q承诺:如何顺序尝试多个注册表

时间:2015-02-07 21:45:33

标签: javascript node.js promise q

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

  • 我们需要找到(通过ID)一些信息(比如订单)
  • 我们有多个存储库,可能包含信息(目录,数据库,nosql,REST服务......)
  • 我们有一个搜索序列。也就是说,我们不希望并行搜索它们并获得最快的胜利,但我们需要在另一个存储库之后依次搜索一个存储库
  • 我们可以在找到信息后停止搜索并忽略其余的存储库
  • 我们已经为每个存储库提供了承诺

我所挣扎的是在找到信息后创建/返回完成的承诺。

像(伪代码):

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

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

1 个答案:

答案 0 :(得分:1)

非常类似于您的伪代码,除非我们使用可执行链接,因为操作是异步的:

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
    });
});

这将解析为将成为第一个成功的存储库的承诺p,或者如果全部失败则拒绝承诺 - 请注意,这假设您的findById API使得它返回一个值成功查找result.success === true,否则result.success === false。如果您在实际API中遇到问题或者遇到问题,请告诉我。玩得开心:))