5

我正在替换一些使用 jQuery Deferred 对象的旧代码,并且正在使用 Bluebird/ES6 Promises 重写。

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

使用 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 语法重写它?

4

2 回答 2

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

});
于 2014-10-29T16:04:38.907 回答
5

使用Promise.all. 请注意,它需要一个诸如 Array之类的可迭代对象$.when作为其参数,与 不同,因此不需要.apply.

您还需要使用Promise.resolve(thejQueryDeferred). 编辑:这是通过调用隐式完成的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!');
});
于 2014-10-29T15:47:36.427 回答