dav*_*ave 5 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!');
});
Run Code Online (Sandbox Code Playgroud)
如何使用ES6 Promise语法重写此内容?
用Promise.all.请注意,它需要一个可迭代的数组作为其参数,不像$.when,所以不需要.apply.
您还希望将jQuery Deferred转换为本机ES6承诺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!');
});
Run Code Online (Sandbox Code Playgroud)
由于这是标记蓝鸟,除了你已经在这里得到的两个好的解决方案是一个更"蓝鸟"的方式:
var requests = [...];
Promise.map(requests, $.get).then(function(results){
alert('all promises complete!');
});
Run Code Online (Sandbox Code Playgroud)
这可能很简单.
正如其他人所指出的那样,本机es6方式将是使用Promise.all,不需要Promise.resolve或不需要显式创建.本机承诺最干净的方式可能是:
var requests = [...];
Promise.all(requests.map($.get)).then(function(results){
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3019 次 |
| 最近记录: |