[英]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.