jQuery 的 Deferred/promise 有两种结果:resolved 和 denied。您可以将回调附加到与任一状态关联的 Deferred。附件的条件是完成(与已解决相关)、失败(与拒绝相关)和始终(与两种状态相关)。当状态从挂起变为非挂起时,我一直试图确定回调的顺序,但没有成功;即,对于done 和always(或fail 和always),对于resolved 和rejected 的每个状态,回调执行的顺序是什么?
问问题
5678 次
2 回答
13
@Malcolm 的回答确实是正确的。文档在很多地方都提到了它,包括:
deferred.done()
和deferred.fail()
– “回调按照添加的顺序执行。”deferred.always()
– “当 Deferred 被解决或拒绝时,回调按添加顺序执行”jQuery.ajax()
– “Promise 回调——.done()
,.fail()
,.always()
, 和.then()
——按照注册的顺序被调用。”
实施细节
查看Deferred 模块,它使用了实现 FIFO“回调列表”的回调模块。
这是用于将回调添加到 Deferred 对象的调用堆栈:
always()
done()
/fail()
Callbacks.add()
list.push()
– 回调函数被推到列表的末尾。
这是用于解析/拒绝 Deferred 对象的调用堆栈:
于 2015-09-20T17:33:16.247 回答
6
延迟对象按照将回调添加到延迟对象的顺序处理其回调。done()
over没有优先级always()
,反之亦然。resolved()
无论您调用还是,行为都是相同的reject()
。
请参阅以下jsfiddle 示例。
对原始问题的评论不正确,或者至少不完全正确。
于 2015-06-24T17:29:04.640 回答