2012-02-09 4 views
0

私には機能があります。関数の内部は次のようになります:jQuery延期:

私はこれを単純に遅延させて使うことができます。私の試みは次のようになります:

var do_it = doSomething; 

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

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

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

EDIT:変数名の変更doからdo_it。これはコードの問題ではありません。問題は、do_itdoSomethingの場合、doSomethingが実行されないことです。

+2

*やる* javascriptの – Gigi

答えて

3

doはjavascriptのキーワードなので、変数の名前を変更してください。

var do_it = doSomething; 

if (!isNewCustomer) { 
    do_it = $.getJSON(..., function(result) { 
     doSomethingElse(); 
    }); 
} 
//   || << note me 
$.when(do_it()).done(function() { 
    cleanup(); 
}); 
+0

おかげでキーワードがあるが、do_it'は 'doSomething'、あるときに' 'doSomething'が呼び出されることはありません。 – barfoo

+0

私はjqueryを延期したことはまったく分かりませんが、* when *呼び出しの中で*実際に*条件関数を呼び出さなければならないようです。 私は自分の答えを編集しました。 – Gigi

+0

1.元のqでは、この機能は実行されません。あなたは単に引数として関数を渡します(括弧はありません)。 2)あなたのdoSomethingが新しいDeferredを返すなら、簡単に見つけられることを考慮すると、cleanUpは返された遅延が解決された後にのみ呼び出されるという意味でも機能しません。 – sbr

1
var result; 

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

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

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

+2

あなたはあなた自身を落としたことに気づいていますか? – Jason

-1

明示的に据え置きが必要です。 whenfer()がDeferredではない引数を渡すと、関数はすぐに呼び出され、予期せぬ結果が出ている可能性があります。

var deferred = $.Deferred(); 

if (isNewCustomer) { 
    deferred.resolveWith(doSomething()); 
} 
else { 
    $.getJSON(...). 
     done(function(result) { 
      deferred.resolveWith(doSomethingElse(result)); 
     }). 
     fail(function(...) { 
      deferred.rejectWith(...); 
     }); 
} 

deferred.promise().always(function() { cleanup(); }); 
+0

Deferredを使用しても何も変更されません... $。これは内部的に既に内部で行われています...私は実際にそれをコード化したので、私はそれを知っています。 –

+0

あなたの解決策は何ですか? – Jason

+0

あなた自身の回答も含め、ここにあるすべての回答にsnarky返信を追加したことをご存知ですか?ここでjQueryチームのポイントを獲得していないことにも気づいていますか? – Jason

0

繰延を使用して、このjsfiddle https://jsfiddle.net/timlint/tg7xqtha/

が移動するための方法でチェックしてください。時にはフローを把握するのは少し難しく、データを渡す方法もありますが、この例ではいくつかの洞察が得られます。

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

この関数は、遅延した.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(); 
}