我有一個我想要提出Web請求的網址陣列。我想以承諾的方式異步調用Web請求,並繼續鏈接以完成任何承諾。現在我做當任何承諾完成時,是否有可能履行承諾?
.then((lines) => {
var tasks = [];
lines.forEach((line) => {
tasks.push(() => { return rp(BASE_URL + line); });
});
return Promise.map(tasks, (job) => { return job(); }, { concurrency: 5 });
})
.then((info) => {
inspect('info: ' + info);
})
然而,與此有關的問題是,它等待所有任務調用next .then()
我想知道是否可以調用。那麼()對任何前完成任務已經解決,並繼續鏈?
我猜我可以這樣做:
.then((lines) => {
lines.forEach((line) => {
rp(BASE_URL + line)
.then((info) => {
inspect(info);
});
});
})
.then((a) => {
// all requests have been made
})
這開始像地獄的回調,因爲我嵌套我。那麼()的,將可能需要在其他一些情況下,這樣做我遇到同樣的問題。
我所尋找的是這樣的:
.then((lines) => {
lines.forEach((line) => {
yield return rp(BASE_URL + line);
});
})
.then((info) => {
// will call inspect on each yield
inspect('info: ' + info);
})
您可以實現自己的類型承諾。也許將它命名爲PromiseGroup或PromiseList。這種類型的對象將代表任意數量的承諾。然後你可以編寫例如(line => rp(BASE_URL + line))。then(info => inspect('info:'+ info))' – SpiderPig
你的「回撥地獄」版本是正確的。 Promise使你不必爲多次回調而保留嵌套縮進級別,但是如果你需要做的事情不在鏈的「最高級別」,嵌套的promise應該沒問題 –
看到Benjamin的解決方案後,我必須說Obserbles看起來像一個很棒的解決所以也許你可以有一個名爲'arrayToObservable'的函數或類似的東西來將'lines'轉換爲可觀察的。 – SpiderPig