【发布时间】:2017-11-24 16:07:45
【问题描述】:
我仍在尝试找到一种方法来有条件地处理循环中的承诺,并能够跳出循环。
这是一个简短的例子
return new Promise(function (resolve, reject) {
if (ipAddresses.length > 0) {
let currentServer, agentOptions;
for (let i = 0; i < ipAddresses.length; i++) {
currentServer = ipAddresses[i];
agentOptions = {
};
// We need to block here
let isReachable = NetworkUtils.checkIfReachable(agentOptions, ip);
if (isReachable) {
resolve(currentServer);
// Break out of the loop
return currentServer;
}
else {
// Continue looping and trying to find a working server
}
}
reject(new Error("No working servers found"));
}
else {
resolve(new Error("No servers ips provided"));
}
})
问题是我不需要并行运行所有请求位于Promise.all 或async.foreach,但我需要依次调用每个承诺,如果条件为真,我需要打破循环并执行就我找到可访问的服务器而言,不要提出任何进一步的请求。
请提出处理此用例的正确方法。我一直在寻找很长时间,但仍然没有找到任何好的解决方案。
谢谢
编辑
抱歉,是的 NetworkUntils.checkIfReachable() 回报承诺
【问题讨论】:
-
NetworkUtils.checkIfReachable(agentOptions, ip)是同步请求吗? -
我认为
Promise.race()是您正在寻找的。span> -
如果你“不需要像 Promise.all 那样并行运行所有请求”或者做异步请求,我问你为什么需要 Promise?
-
您的代码似乎表明
NetworkUtils.checkIfReachable()是同步的(尽管这似乎不太可能)。如果它是同步的,那么你根本不需要承诺。你可以运行一个常规的for循环并在找到答案时返回——没有承诺。如果NetworkUtils.checkIfReachable()实际上是异步的,那么向我们展示它具有的异步接口,以便我们可以为它进行适当的编码。
标签: node.js asynchronous ecmascript-6 promise async-await