5

シーケンシャル非同期呼び出しはグロスです。もっと読みやすい解決策はありますか?

問題は、これを追跡するのが難しいことです。

ajaxOne(function() {
  // do something
  ajaxTwo(function() {
    // do something
    ajaxThree()
  });
});

ここで、無名関数はサーバーの応答で呼び出されるコールバックです。

サードパーティのAPIを使用してAJAX呼び出しを行っているので、一般的なソリューションが必要です。

4

4 に答える 4

3

救助のための関数型プログラミング!jsdeferredを使用すると、次のように例を記述できます。

next(ajaxOne).next(ajaxTwo).next(ajaxThree).error(function(e){alert('An error happened:' + e)})

「シーケンシャル」なajaxOne/Two / Three関数のそれぞれは、前の関数の返された結果をパラメーターとして受け取ります。追加のパラメーターを渡す必要がある場合は、ajaxチェーンを呼び出す前に、それらをグローバルオブジェクトで公開できます。

于 2010-05-12T13:06:48.100 に答える
1

ネストされた関数が1つしかない場合は、そのままにしておいてかまいませんが、ネストされた呼び出しが複数ある場合は、これらのコールバックを別のメソッドで記述し、ネストされた関数から呼び出すことを検討してください...

ajaxOne(function(result) { handleAjaxOneCallback(result, someExtraNeededArg); } );

function handleAjaxOneCallback(result, someExtraNeededParam) {
  // do something

  ajaxTwo(function(result) { handleAjaxTwoCallback(result, myFoo, myBar); });
}

function handleAjaxTwoCallback(result, foo, bar) {
  // do something

  ajaxThree(/* ... */);
}
于 2010-05-12T12:56:52.173 に答える
1

まず、私はJavaScriptに比較的慣れていないことを認めなければなりませんが、最近、jQueryajax関数を使用しているときに同じ問題が発生しました。POSTを介していくつかのドキュメントを特定の順序でサーバーにアップロードする必要がありました。すべてのコールバックをネストすると、完全に混乱したコードが生成されます。答えを読んだ後、解決策を考え、うまくいく解決策を思いつきました。さまざまなコールバック呼び出しを区別するために、switch句を持つ1つの関数のみを使用します。

var callback = function(sCallIdentifier, callbackParameters){
  switch(sCallIdentifier){
     case "ajaxOne":
        doYourStuff(callbackParameters); //do your stuff for ajaxOne
        ajaxTwo(function(newCallbackParameters){
           /*define a anonymous function as actual method-callback and pass the call-identifier, together with all parameters, to your defined callback function*/
           callback("ajaxTwo", newCallbackParameters);
        });
       break;
     case "ajaxTwo":
       doYourStuff(callbackParameters);
       ajaxThree(function(newCallbackParameters){
          callback("ajaxThree", newCallbackParameters);
       });
       break;
     case "ajaxThree":
       doYourStuff();
       break;
 }
});

これが良くない場合は、私に知らせてください。私が言ったように、私はJavaScriptの専門家ではありませんが、私にとってはかなりうまくいきました。

最高、ルネ

編集:

しばらくして、Promisesがこの問題を解決するためのはるかに優れたアプローチであることがわかりました。

于 2013-01-16T08:42:38.640 に答える
0

コールバックにクロージャスコープが必要ない場合は、おそらく必要ありませんが、コールバックを別々の関数に入れて、名前で呼び出すことができます。お気に入り:

var ajaxOne = function() {
    doTheAjax(callbackOne);
}
var callbackOne = function() {
    //funny things ...
    doTheAjax(callbackTwo);
}
var callbackTwo = function() {
    //even more funny things ...
}
于 2010-05-12T13:04:17.940 に答える