在延迟对象解析后执行可执行函数

时间:2015-03-03 19:59:23

标签: javascript jquery promise jquery-deferred

如何在函数返回Deferred.promise()之后运行一个返回promise的函数?

我在JSFiddle上有一个问题的例子。警报消息旨在以“执行第三个?”结束。而不是在“执行第一次”的中间显示警报?并“执行第二次?”警报信息。

另外,为什么JSFiddle的示例代码无法按预期顺序执行?

1 个答案:

答案 0 :(得分:2)

承诺通过返回值来工作。如果您没有从then返回,则承诺无法知道它应该在后续then中等待该值。

当你这样做时:

login()
.then(function() {
    getGuIdFromUser(); // return undefined implicit
})
.then(function() {
    getUserData('val'); // return undefined implicit
});

由于隐式返回undefined,因此库无法等待该值。如果您添加退货,则可以:

login()
.then(function() {
    return getGuIdFromUser();
})
.then(function() {
    return getUserData('val');
});

请注意$.getJSON已经返回一个承诺,因此无需将其包装在$.Deferred中。