簡體   English   中英

如何在所有javascript ES6 Promise解決后運行

[英]How to run after all javascript ES6 Promises are resolved

我正在替換一些使用jQuery Deferred對象的舊代碼,我正在使用Bluebird / ES6 Promises進行重寫。

如果我有多個異步調用,在解決所有promise之后如何觸發函數。

使用jQuery Deferreds它會是這樣的:

var requests = [...]; //some arbitrary data that is iterated to generate multiple ajax requests
var promises = [];
resuests.forEach(function(endpoint) {
    promises.push($.ajax({url: endpoint}));
});

$.when.apply($, promises).then(function() {
    alert('all promises complete!');
});

如何使用ES6 Promise語法重寫此內容?

使用Promise.all 請注意,它需要一個可迭代的數組作為其參數,與$.when .apply不同,因此不需要.apply

您還希望使用Promise.resolve(thejQueryDeferred)將jQuery Deferred轉換為本機ES6承諾。 編輯:這是通過調用Promise.all隱式完成的,所以實際上是可選的。

整碼:

var requests = [...]; //some arbitrary data that is iterated to generate multiple ajax requests
var promises = [];
requests.forEach(function(endpoint) {
    var nativePromise = Promise.resolve($.ajax({url: endpoint})); // if you want to make it clear that you're converting from jQuery Deferred to ES6 promise!
    promises.push(nativePromise);
});

Promise.all(promises).then(function() {
    alert('all promises complete!');
});

由於這是標記 ,除了你已經在這里得到的兩個好的解決方案是一個更“藍鳥”的方式:

var requests = [...];

Promise.map(requests, $.get).then(function(results){
    alert('all promises complete!');
});

這可能很簡單。

正如其他人所指出的那樣,本機es6的方式是使用Promise.all ,不需要Promise.resolve或顯式創建。 本機承諾最干凈的方式可能是:

var requests = [...];
Promise.all(requests.map($.get)).then(function(results){

});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM