0

私はjQueryの遅延の使用方法を学んでいるので、簡単な小さな例を作成して、いじり回すことができました。

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次に、複数のpromiseを(それ自体がpromiseを返す)と組み合わせることができるので、 a()2つの関数に分割することにしました。

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())は2つの約束を組み合わせるために使用しますが、機能していません。プログレスバーは50%になりますが、100%にはなりません。また、my.doneが呼び出されることはありません。

内部の.notify(および)は効果がないようです。ここで何が問題になっていますか?2つの約束を組み合わせるにはどうすればよいですか?.resolveb()$.when

4

1 に答える 1

3

dfunction で を解決しているようには見えませんa。によって返される promise は$.when、それに含まれるすべての promise が解決されたときに解決されます。http://jsfiddle.net/3DDSa/6を参照

.done-promiseで渡される引数はwhen、作成時と同じ順序になります。そのためxdone-callback はa( ) で解決されundefinedarguments[1]値を参照し、b が ( "done") で解決された値を参照します。http://jsfiddle.net/3DDSa/11を参照

when-promiseへの進行状況コールバックは、引数の数を増やして同じように機能するようです。

于 2012-08-10T18:59:05.877 に答える