我正在学习如何使用jQuery的deferred,所以我做了一个简单的小例子,所以我可以乱七八糟。
function a() {
var d = new $.Deferred,
$A = $('#A'),
$P = $('#P').progressbar();
setTimeout(function() {
$A.css('background-color', 'blue');
d.notifyWith($P, [.5]);
}, 2000);
setTimeout(function() {
$A.text('test');
d.notifyWith($P, [1]);
d.resolveWith($P, ['done']);
}, 4000);
return d.promise();
}
$('#G').click(function() {
a().progress(function(x) {
this.progressbar({
value: x * 100
});
}).done(function(x) {
alert(x)
});
});
DEMO:http://jsfiddle.net/NTICompass/3DDSa/3/
此示例效果很好。操作完成后,会弹出一个警告。
我读过你可以将多个承诺与$.when
(它本身返回一个承诺)结合起来,所以我决定将a()
分成两个函数:
function a() {
var d = new $.Deferred,
$A = $('#A');
setTimeout(function() {
$A.css('background-color', 'blue');
d.notify(.5);
}, 2000);
return d.promise();
}
function b() {
var d = new $.Deferred,
$A = $('#A');
setTimeout(function() {
$A.text('test');
d.notify(1);
d.resolve('done');
}, 4000);
return d.promise();
}
$('#G').click(function() {
var $P = $('#P').progressbar();
$.when(a(), b()).progress(function(x) {
$P.progressbar({
value: x * 100
});
}).done(function(x) {
alert(x)
});
});
DEMO:http://jsfiddle.net/NTICompass/3DDSa/8/
我使用$.when(a(), b())
来组合2个承诺,但它不起作用。进度条为50%,但不是100%,我的.done
永远不会被调用。
似乎.notify
内.resolve
(和b()
}没有任何效果。这有什么不对?如何使用$.when
组合2个承诺?
答案 0 :(得分:3)
您似乎无法解析函数d
中的a
。 $.when
返回的承诺在其包含的所有承诺得到解决后得到解决。看到
http://jsfiddle.net/3DDSa/6
.done
- 承诺中传递给when
的参数与创建时的顺序相同。所以x
done
中的a
- 回调是指undefined
解决的值(arguments[1]
),而"done"
是指b解析的值( when
)。见http://jsfiddle.net/3DDSa/11
看起来{{1}} - promise的进程回调的工作方式相同,参数数量增加。