Q Promises:如何顺序尝试多个注册中心
Q Promises: how to sequentially try multiple registries
我可能需要一些关于 node.js 应用程序的 Q promises 的帮助。我的用例如下:
- 我们需要(通过 ID)查找一些信息(例如订单)
- 我们有多个可能包含信息的存储库(目录、数据库、nosql、REST 服务...)
- 我们有一个搜索序列。那就是我们不想并行搜索它们并且最快的获胜,但我们需要一个接一个地搜索存储库
- 一旦找到信息,我们就可以停止搜索并忽略剩余的存储库
- 我们已经为每个存储库提供了承诺
我正在努力的是 create/return 找到信息后完成的承诺。
类似于(伪代码):
var deferred = Q.defer(id)
foreach repo in repositories {
var p = repo.findById(id)
.then deferred.resolve(order)
p.waitForThePromiseToFinish
if (p.success) break
}
知道如何实现这个吗?感谢任何帮助。
很像你的伪代码,除了我们使用 thenable 链接,因为操作是异步的:
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 是这样的它 returns 在成功找到时具有 result.success === true
的值,否则 result.success === false
。如果您在根据实际 API 进行调整时遇到问题,或者遇到问题,请告诉我。玩得开心:)
我可能需要一些关于 node.js 应用程序的 Q promises 的帮助。我的用例如下:
- 我们需要(通过 ID)查找一些信息(例如订单)
- 我们有多个可能包含信息的存储库(目录、数据库、nosql、REST 服务...)
- 我们有一个搜索序列。那就是我们不想并行搜索它们并且最快的获胜,但我们需要一个接一个地搜索存储库
- 一旦找到信息,我们就可以停止搜索并忽略剩余的存储库
- 我们已经为每个存储库提供了承诺
我正在努力的是 create/return 找到信息后完成的承诺。
类似于(伪代码):
var deferred = Q.defer(id)
foreach repo in repositories {
var p = repo.findById(id)
.then deferred.resolve(order)
p.waitForThePromiseToFinish
if (p.success) break
}
知道如何实现这个吗?感谢任何帮助。
很像你的伪代码,除了我们使用 thenable 链接,因为操作是异步的:
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 是这样的它 returns 在成功找到时具有 result.success === true
的值,否则 result.success === false
。如果您在根据实际 API 进行调整时遇到问题,或者遇到问题,请告诉我。玩得开心:)