使用 jQuery 解决循环中的承诺 [重复]

Posted

技术标签:

【中文标题】使用 jQuery 解决循环中的承诺 [重复]【英文标题】:Resolve promises from a loop with jQuery [duplicate] 【发布时间】:2017-02-21 03:41:05 【问题描述】:

所以一个 XHR 在一个循环中运行,我想在所有 XHR 完成后执行一个函数,我尝试了如下承诺。

var promises = [];
for(var i=0;i<5;i++)
    promise = $.ajax(
                    type: "POST",
                    url : data_url,
                    data:pdata
    );
    promises.push(promise);

$.when(promises).then(function()
                window.location.href = '/cart?edit_order=true'
)

问题是重定向发生在 AJAX 完成之前,我错过了什么?

【问题讨论】:

我看到您在标题中指定了 jQuery,但仅出于历史目的,您可以以“更好”的方式执行此操作,更好是指更好的可读性和可扩展性。 q.all([loadSomething(), loadAnotherThing()]) .spread(function(something, another) DoSomethingOnThem(something, another); ); 其中loadSomething(), loadAnotherThing() 是两个承诺,q.all 来自以下承诺库:github.com/kriskowal/q 【参考方案1】:

如果我没记错的话,jQuery 的 .when() 方法不接受 Array 的承诺作为参数,而是接受单个参数。这只是意味着您需要将调用它的方式更改为:

$.when.apply( null, promises ).then(function()
            window.location.href = '/cart?edit_order=true'
)

使用Function.prototype.apply 将自动获取一个Array 并将该Array 的每个值作为单个参数放入被调用的函数中,在本例中为.when()。有效地传播论点。

您还可以做一些 EMCAscript 魔术并为此创建一个小部分应用程序:

var when = Function.prototype.apply.bind( $.when, null );

..然后只需调用

when( promises ).then(function()  ...

【讨论】:

你的意思是应用,它传播论点? 在最新版本的ES中也可以使用$.when(..promises) 当然,但是您“可以”也使用本机 Promise 和箭头函数等等,但是您应该强烈建议使用预编译器或转译器。目前浏览器版本还没有广泛支持解构。 是的,转译可能很复杂......但关键是它是一种非常优雅的方式。 “最近的版本”是您刚才所说的建议。

以上是关于使用 jQuery 解决循环中的承诺 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

将变量保存在具有承诺的函数中的Javascript问题[重复]

将已解决的承诺值传递到最终的“then”链的最佳方法是啥[重复]

如何从jquery中的给定对象数组中打印用户名[重复]

javascript函数中的一个函数来重复js jquery jq循环

如何使用jQuery解决动态加载页面中的重复对象?

Node.js 核心中的承诺 [重复]