【发布时间】:2016-12-08 12:36:47
【问题描述】:
我有一堆函数用于为我的服务提供数据。我想遍历它们中的每一个,并在其中一个返回所需结果时立即停止。如果第一个有效,那很好。如果它有异常或数据无效,我想移动到下一个,依此类推。
我怎样才能做到这一点?我有以下代码:
handleData: function(address) {
var self = this;
return new Promise(function (resolve, reject) {
for (var i = 0; i < self.listAllAvailableProviders.length; ++i) {
var handler = self.listAllAvailableProviders[i];
new handler().getData(address)
.then(function(value) {
Logger.info(value);
resolve(value);
})
.catch(function(err){
Logger.error(err);
})
}
reject("");
});
}
如何修复它以在第一个获得正确数据后立即停止?我已经阅读了bluebirdjs 文档,但无济于事。
编辑
我在resolve 之后放了一个break 声明,我得到了这个:
SyntaxError: Illegal break statement
at Object.exports.runInThisContext (vm.js:53:16)
at Module._compile (module.js:513:28)
at Object.Module._extensions..js (module.js:550:10)
at Module.load (module.js:458:32)
at tryModuleLoad (module.js:417:12)
at Function.Module._load (module.js:409:3)
at Module.require (module.js:468:17)
at require (internal/module.js:20:19)
【问题讨论】:
-
您在
for循环中并行运行所有请求。当您找到您喜欢的结果时,所有其他请求都已启动。您可以一次序列化您的请求,然后仅在没有找到您喜欢的答案时才继续处理下一个请求。这就是你想要的吗? -
能否进一步解释一下序列化?我想要第一个成功的,所以如果一个不起作用,那么尝试下一个。这是使用
sailsjs。 -
解释什么?我不知道你不明白我评论的哪一部分。你想序列化你的请求(一次运行一个)吗?
-
是的,可以。但我处于一个一切都在承诺的情况下......