我仍然試圖找到一種方法來處理循環中的承諾,並有條件地打破循環。如何有條件地處理帶有承諾的循環
下面是一個簡單的例子
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