0

機能があります。関数の内部は次のようになります。

if (isNewCustomer) {
    doSomething();
    cleanup();
}
else {
    $.getJSON(..., function(result) {
        doSomethingElse();
        cleanup();
    });
}

私は、deferredを使用することでこれを簡単に実行できることを望んでいました。私の試みは次のようになります:

var do_it = doSomething;

if (!isNewCustomer) {
    do_it = $.getJSON(..., function(result) {
        doSomethingElse();
    });
}

$.when(do_it).done(function() {
    cleanup();
});

しかし、これは機能していません。私は何が間違っているのですか?

編集:変数の名前をに変更doしますdo_it。これはコードの問題ではありません。問題は、がの場合do_itdoSomethingdoSomething実行されないことです。

4

4 に答える 4

3

do は JavaScript のキーワードであるため、変数の名前を変更することをお勧めします。

var do_it = doSomething;

if (!isNewCustomer) {
    do_it = $.getJSON(..., function(result) {
        doSomethingElse();
    });
}
//          || << note me
$.when(do_it()).done(function() {
    cleanup();
});
于 2012-02-09T22:46:15.633 に答える
1
var result;

if (isNewCustomer) {
    result = doSomething();
} else {
    result = $.getJSON( ..., function( data ) {
        doSomethingElse( data );
    });
}

$.when( result ).done(function() {
    cleanup();
});

上記のコードを参照してください。ジジが指摘したように、関数を呼び出したことはありません。

于 2012-02-10T01:28:44.273 に答える
0

このjsfiddleをチェックして ください https://jsfiddle.net/timlint/tg7xqtha/

Deferred を使用する方法です。フローとデータの受け渡し方法を把握するのは少し難しい場合がありますが、この例は洞察を与えるかもしれません。

deferred はほとんどフラグと考えることができます。関数では、遅延オブジェクトを作成します。

関数は、その遅延の .promise() を返します。これにより、関数 doSomething(bool).done() を呼び出して、終了後に何かを実行できます。タスクが完了し、それまで呼び出されないことがわかっている場合は、遅延を解決します。

function doSomething(isNewCustomer)
{

// think of a deferred as a flag object in a way
var d = $.Deferred();


if(!isNewCustomer)
{
    $.getJSON(..., function(result) {
        // work with data
    }).done(function() {
        // finisn up data

        // set deferred to resolved
        d.resolve();
    });
}
else
{
    // some business logic

    // set deferred to resolved
    d.resolve();   
}
// returning the promise lets you call .done()
// on this function call in the main call
return d.promise();
}
于 2015-02-20T17:30:50.810 に答える