我正在学习如何使用 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)
});
});
演示: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)
});
});
演示:http: //jsfiddle.net/NTICompass/3DDSa/8/
我曾经$.when(a(), b())
将这两个承诺结合起来,但它不起作用。进度条达到 50%,但没有达到 100%,并且.done
永远不会调用 my。
.notify
里面的( 和.resolve
)似乎b()
没有任何效果。这里有什么问题?我如何使用$.when
结合 2 个承诺?