Javascript 有没有更好的方法可以按照一定的顺序执行一组部分异步的jQuery函数?

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

我有四个功能,必须按一定的顺序完成。除了其中一个函数外,所有函数都执行一些异步AJAX功能,不过它们(必须)也执行其他功能。这些是我自己的函数,通过这样做,我把它们变成了延迟承诺对象:

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)。很高兴听到-我回答了这个问题