使用jQuery并行执行多个promise后等待完成
Wait for completion after multiple promises in parallel using jQuery
我想使用jquery:的延迟/承诺实现对多个异步ajax请求进行排队
function doSomething() {
console.log('doSomething')};
function makeMultiAjaxRequests1() {
console.log('makeMultiAjaxRequests1')};
function makeMultiAjaxRequests2() {
console.log('makeMultiAjaxRequests2')};
var step1 = function () {
var promise = new $.Deferred().promise();
makeMultiAjaxRequests1();
return promise; }
var step2 = function () {
var promise = new $.Deferred().promise();
makeMultiAjaxRequests2();
return promise; }
step1()
.then(step2())
.done(doSomething());
$.when(step1(),
step2())
.done(function () {
doSomething();
});
这是小提琴的链接。所以我的问题是:
在步骤1和步骤2并行执行的模式中,代码不会到达最后一个处理程序函数。为什么?
您需要在步骤1和步骤2中解析deferred
对象
试试这个
function doSomething() {
console.log('doSomething')};
function makeMultiAjaxRequests1(deferred) {
console.log('makeMultiAjaxRequests1')
deferred.resolve()};
function makeMultiAjaxRequests2(deferred) {
console.log('makeMultiAjaxRequests2')
deferred.resolve()};
var step1 = function () {
var deferred = new $.Deferred();
makeMultiAjaxRequests1(deferred);
return deferred; }
var step2 = function () {
var deferred = new $.Deferred();
makeMultiAjaxRequests2(deferred);
return deferred; }
step1().then(step2).done(doSomething);
$.when(step1(), step2()).done(function () {
doSomething();
});
@Daiwei给出了一个很好的答案。
一个常见的要点是https://gist.github.com/sergio-fry/3917217由塞尔吉奥·弗莱。
如果您想要一种更动态的方法,在这种方法中,您事先不知道有多少个参数是并行运行的,下面是JQuery(1.10+)的一个很好的扩展示例:
$.whenAll = function (deferreds) {
function isPromise(fn) {
return fn && typeof fn.then === 'function' &&
String($.Deferred().then) === String(fn.then);
}
var d = $.Deferred(),
keys = Object.keys(deferreds),
args = keys.map(function (k) {
return $.Deferred(function (d) {
var fn = deferreds[k];
(isPromise(fn) ? fn : $.Deferred(fn))
.done(d.resolve)
.fail(function (err) { d.reject(err, k); })
;
});
});
$.when.apply(this, args)
.done(function () {
var resObj = {},
resArgs = Array.prototype.slice.call(arguments);
resArgs.forEach(function (v, i) { resObj[keys[i]] = v; });
d.resolve(resObj);
})
.fail(d.reject);
return d;
};
请参阅动态实时示例中的代码:
http://jsbin.com/nuxuciwabu/edit?js,控制台
如果你给它一个它可以实际访问的URL,它确实会访问你的done
函数(在jsfiddle的情况下,也就是说/echo/html/
:http://jsfiddle.net/LnaPt/2/
基本上,你只需要这样做:
var promise = $.ajax({
type: "GET",
url: "/echo/html/", //<-- instead of google
}).promise();
相关文章:
- 等待's返回Promise而不是value
- 正在等待bluebird promise内部的可选流程操作
- 使用jQuery并行执行多个promise后等待完成
- 等待promise解析后再执行代码
- 如何使EXPECT条件等待promise被解析(代码封装在方法中)
- 在promise链中等待DOM元素中的突变
- 在循环中使用 q promise 的最佳方法是什么?等待链完成,然后再迭代到下一个
- 在返回结果之前,我如何等待 jQuery.ajaxComplete in promise.done
- 使用 promise 等待数据库操作
- JQuery Promise:fail()在未等待Promise解析的情况下被调用
- defer.promise 不等待对象解析
- 如何创建一个返回等待EventEmitter的promise的函数
- 生成器在等待promise解析时返回未定义的值
- Angular -等待promise和onload方法被完成
- 在下一次循环迭代之前等待promise结果
- 如何让Node在无限while循环中等待promise完成
- 定义一个NavigationInstruction,等待promise返回
- angular1:如何在父控制器中等待promise解析
- Angular的路由解析不等待promise
- 等待promise和nested then完成