如何在所有javascript ES6 Promise解决后运行

时间:2014-10-29 15:41:00

标签: javascript promise bluebird es6-promise

我正在更换一些使用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语法重写此内容?

2 个答案:

答案 0 :(得分:5)

使用Promise.all。请注意,采用可迭代的(例如数组)作为其参数,与$.when不同,因此不需要.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!');
});

答案 1 :(得分:5)

由于这个被标记为,除了你已经在这里获得的两个好的解决方案之外还有一个更多的蓝鸟"方式:

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){

});