0

我正在学习如何使用 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 个承诺?

4

1 回答 1

3

看起来你从来没有解决过d函数中的问题a$.when当它包含的所有承诺都被解决时,返回的承诺被解决。见 http://jsfiddle.net/3DDSa/6

-promise 中传递的参数.donewhen创建它时的顺序相同。所以xin done-callback 指的a是用 ( undefined) 解析的值,并arguments[1]指的是 b 用 ( "done") 解析的值。见http://jsfiddle.net/3DDSa/11

看起来when-promise 的进度回调以相同的方式工作,但参数数量增加了。

于 2012-08-10T18:59:05.877 回答