我有四个必须按特定顺序完成的功能。除了其中一个函数之外的所有函数都会在其中执行一些异步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();
});
});
});
尽管我编写了一个辅助函数来简化实现,但这种感觉非常冗长。我也不太明白为什么我最初的尝试失败了。有什么我想念的东西,或者这是我能得到的那么简单吗?
答案 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);