【发布时间】:2014-03-01 08:18:32
【问题描述】:
我正在使用 Q.js 库来做承诺。我尝试了以下场景,其中一个函数在执行某些代码之前等待另一个函数来解决延迟问题,并且它与 jQuery 本机承诺一起工作得很好。但是,相同的代码会立即在 Q.js 中返回。有什么想法吗?
小提琴:http://jsfiddle.net/ArN8F/5/
HTML:
<button id='go'>Go</button>
<p id='txt'></p>
<p id='txt2'></p>
jQuery 代码(等待 2 秒然后更改文本):
$(document).ready(function () {
var dfd = $.Deferred();
$('#go').click(function () {
$('#txt').text('Clicked!');
promised();
setTimeout(dfd.resolve, 2000);
});
function promised() {
$.when(dfd).done(function () {
$('#txt2').text('Done');
});
}
})
Q.js 代码(立即更改文本):
$(document).ready(function () {
var dfd = Q.defer();
$('#go').click(function () {
$('#txt').text('Clicked!');
promised();
setTimeout(dfd.resolve, 2000);
});
function promised() {
Q.when(dfd, function () {
$('#txt2').text('Done');
});
}
})
【问题讨论】:
-
可能已经意外解决了?如果在 click 事件中创建了一个 new deferred,会发生什么?此外,在 jQuery 中与
Q.when(dfd, ..)等效的是dfd.then(..),而 not$.when(它是等效于Q.all的聚合器)。 -
不,就这么简单。我什至使用过 Q.all,在这种情况下它永远不会返回。检查我刚刚添加的小提琴。