Javascript 有没有更好的方法可以按照一定的顺序执行一组部分异步的jQuery函数?
我有四个功能,必须按一定的顺序完成。除了其中一个函数外,所有函数都执行一些异步AJAX功能,不过它们(必须)也执行其他功能。这些是我自己的函数,通过这样做,我把它们变成了延迟承诺对象:Javascript 有没有更好的方法可以按照一定的顺序执行一组部分异步的jQuery函数?,javascript,jquery,ajax,asynchronous,Javascript,Jquery,Ajax,Asynchronous,我有四个功能,必须按一定的顺序完成。除了其中一个函数外,所有函数都执行一些异步AJAX功能,不过它们(必须)也执行其他功能。这些是我自己的函数,通过这样做,我把它们变成了延迟承诺对象: function populateOfferSettings() { return $.Deferred(function (deferred) { //Whole bunch of stuff happens here, including async AJAX defe
function populateOfferSettings() {
return $.Deferred(function (deferred) {
//Whole bunch of stuff happens here, including async AJAX
deferred.resolve();
}).promise();
}
当与此结合使用时,实际上效果很好:
populateOfferSettings().then(viewReady);
当我有两个以上的功能时,问题就出现了。事实上,我至少有四个。我尝试了最直观的解决方案,但失败了:
populateOfferSettings().then(populateSegmentationSettings).then(populateHousehold).then(viewReady);
出于我不理解的原因,所有这些功能都已执行,但不用等待承诺完成——它们都会启动。因此,我尝试了这个方法,它实际上按照预期工作,每个函数都等待前一个问题的解决:
populateOfferSettings().then(function () {
populateSegmentationSettings().then(function () {
populateHousehold().then(function () {
viewReady();
});
});
});
尽管如此,这感觉非常冗长,即使我编写了一个帮助函数来简化实现。我也不明白为什么我最初的尝试失败了。是否有我遗漏的东西,或者这是我能得到的最简单的东西?您应该能够继续呼叫
,然后
,但返回链中的下一个承诺
populateOfferSettings()
.then(function () { return populateSegmentationSettings(); })
.then(function () { return populateHousehold(); })
.then(function () { viewReady(); });
您应该能够继续调用
,然后
,但返回链中的下一个承诺
populateOfferSettings()
.then(function () { return populateSegmentationSettings(); })
.then(function () { return populateHousehold(); })
.then(function () { viewReady(); });
在jQuery 1.7.1
中,管道始终是您想要的。您最好先用覆盖。然后用覆盖。管道,因为在jQuery 1.8之前是绝对无用的
populateOfferSettings()
.pipe(populateSegmentationSettings)
.pipe(populateHousehold)
.pipe(viewReady);
在jQuery 1.7.1中,管道始终是您想要的。您最好先用覆盖。然后用覆盖。管道,因为在jQuery 1.8之前是绝对无用的
populateOfferSettings()
.pipe(populateSegmentationSettings)
.pipe(populateHousehold)
.pipe(viewReady);
return
语句是关键区别吗?@TCHdvlp是的。它将返回下一个承诺。此代码等于populateOfferSettings().then(populateSegmentationSettings)。then(populateHousehouse)。then(viewReady)
,因此,如果此方法有效,那么他的原始代码也会有效。OP要么在认为正在传递函数时立即调用函数,要么正在使用jQuery是return
语句的关键区别?@TCHdvlp是的。它将返回下一个承诺。此代码等于populateOfferSettings().then(populateSegmentationSettings)。then(populateHousehouse)。then(viewReady)
,因此,如果此方法有效,那么他的原始代码也会有效。OP要么在认为正在传递函数时立即调用函数,要么正在使用jQuery,您使用的jQuery版本是什么?如果低于1.8,则需要使用.pipe
而不是。然后
。感谢Esailija,我现在使用的是1.7.1版本,而版本与版本之间的区别让我无法理解。这现在似乎工作正常:populateOfferSettings().pipe(populateSegmentationSettings).pipe(populateHousehouse.pipe(viewReady)代码>。很高兴听到-我回答了这个问题您使用的jQuery版本是什么?如果低于1.8,则需要使用.pipe
而不是。然后
。感谢Esailija,我现在使用的是1.7.1版本,而版本与版本之间的区别让我无法理解。这现在似乎工作正常:populateOfferSettings().pipe(populateSegmentationSettings).pipe(populateHousehouse.pipe(viewReady)代码>。很高兴听到-我回答了这个问题