我仍然试图找到一种方法来处理循环中的承诺,并有条件地打破循环。如何有条件地处理带有承诺的循环
下面是一个简单的例子
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
所有要求,但我宁愿要sequentually调用每一个承诺,如果条件为真我需要打破这个循环,只要找到可以访问的服务器,就不要再提出任何请求。
请建议什么是正确的方式来处理这个用例。我一直在寻找很久,但还没有找到任何好的解决方案。
感谢
编辑
对不起,是NetworkUntils.checkIfReachable()
回报承诺
是'NetworkUtils.checkIfReachable(agentOptions,IP)'同步的请求? – Hitmands
我想['Promise.race()'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/race)就是你要找的东西。 –
如果你“不需要像Promise.all那样并行运行所有的请求”或者做异步请求,我问你为什么需要promise? – ranieribt