提问者:小点点

如何在所有javascript ES6promise解决后运行


我正在替换一些使用jQuery延迟对象的旧代码,并且正在使用Bluebird/ES6承诺进行重写。

如果我有多个异步调用,那么在所有承诺都解决之后,我如何触发一个函数。

使用jQuery可以进行延迟:

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个答案

匿名用户

由于这是一个标记为蓝鸟的解决方案,除了您已经得到的两个好的解决方案之外,这里还有一个更“蓝鸟”的方法:

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

});

匿名用户

使用promise.all。注意,它采用一个可迭代的参数,如数组,这与$.when不同,因此不需要.apply

您还希望使用promise.resolve(theJQueryDefered)将jQuery defered转换为本地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!');
});