是否有更好的方法以特定顺序执行一堆部分异步jQuery函数?

时间:2013-11-18 13:59:07

标签: javascript jquery ajax asynchronous

我有四个必须按特定顺序完成的功能。除了其中一个函数之外的所有函数都会在其中执行一些异步AJAX,但是它们(必然)也会执行其他操作。所以这些是我自己的函数,我通过做这样的事情变成了延迟的promise对象:

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();
        });
    });
});

尽管我编写了一个辅助函数来简化实现,但这种感觉非常冗长。我也不太明白为什么我最初的尝试失败了。有什么我想念的东西,或者这是我能得到的那么简单吗?

2 个答案:

答案 0 :(得分:4)

您应该能够继续调用then,但返回链中的下一个承诺。

populateOfferSettings()
  .then(function () { return populateSegmentationSettings(); })
  .then(function () { return populateHousehold(); })
  .then(function () { viewReady(); });

答案 1 :(得分:1)

在jQuery 1.7.1中.pipe总是你想要的。你也可以用.then覆盖.pipe,因为.then在jQuery 1.8之前绝对没用。

populateOfferSettings()
  .pipe(populateSegmentationSettings)
  .pipe(populateHousehold)
  .pipe(viewReady);