使用$ .when来组合承诺

时间:2012-08-10 18:38:34

标签: jquery jquery-deferred

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

1 个答案:

答案 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的进程回调的工作方式相同,参数数量增加。