【发布时间】:2013-04-05 18:20:57
【问题描述】:
这个问题是not asynchronous function executed as jQuery Deferred的精心提炼的版本。
我们有 2 个 jsfiddles:
http://jsfiddle.net/XSDVX/1/ - 尽管调用了 notify() 函数,但这里没有触发进度事件。
http://jsfiddle.net/UXSbw/1/ - 这里的进度事件按预期触发。
唯一的区别是一行代码:
setTimeout(dfd.resolve,1);
对
dfd.resolve();
问题是:
当我们延迟解析时,.then 如何捕获在此回调返回之前调用的 .notify?想想看。 .then 获取从它的第一个参数返回的延迟对象,并从中创建一个新的延迟对象,绑定到它的完成进度和失败事件。如果在延迟返回之前调用了通知,那么即使使用 setTimeout,.then 如何捕获它? (感谢https://stackoverflow.com/users/400654/kevin-b提出这个问题)
我可以摆脱
setTimeout()并仍然触发进度回调吗?
【问题讨论】:
-
只是从上一个问题中添加一些背景信息,需要 setTimeout 的原因是已解决延迟对象不能有更多的进度事件绑定到它们。通过延迟解析,
.then能够绑定到进度事件。 -
如果您意识到所有微妙的后果,这是非常错误的行为。
-
其中有一部分我不太明白。当我们延迟解析时,.then 如何捕获在此回调返回之前调用的 .notify?想想看。 .then 获取从它的第一个参数返回的延迟对象,并从中创建一个新的延迟对象,绑定到它的完成进度和失败事件。如果在延迟返回之前调用了通知,那么即使使用 setTimeout,.then 如何捕获它?
-
我可以看到
.progress的行为就像.done和.fail,如果延迟已经表明一些进展,则立即调用回调。但这里似乎确实存在一个错误:文档明确指出,添加到已解决的 Deferred 的进度回调仍会立即被调用,但.then似乎违反了合同的这一部分。 -
像@KevinB 一样,我更惊讶的是 .notifies 在延迟解决时通过链接的 .thens 传递,而不是在立即解决时不通过 .notifies。
标签: javascript jquery race-condition jquery-deferred deferred