0

function1、2、および 3 をコールバックを介してつなぎ合わせる次のパターンがあります。

function1、2、および 3 が完了するまでに最大 1 秒かかる場合があるとします。より多くのコールバック関数がネストされたときにモンスターにならないように、同じことを行う他の「より良い」方法を知りたいです。

function1(function(cbData1){
  if(cbData1){
    function2(cbData1, function(cbData2){
      if(cbData2){
        function3(cbData2, function(cbData3){
          // success
        }
      } else {
        // failed for reason#2
      }
    });
  } else {
    //failed for reason#1
  }
});


//example function
function function2(data, callback) {
  // do dirty things
  callback(newData);
}
4

2 に答える 2

1

あなたが正しく理解している場合は、チェーン内のコールバックを整理する必要があります。Chain of Responsibilityパターンを見てください。

したがって、実行する関数と、必要に応じて実行するコールバック関数を含むオブジェクトを作成します。

于 2013-01-17T17:56:38.603 に答える
0

最後に非常に厄介なコールバックで遊んだとき、私は次のようなことをしました:

// Typed on the fly, be kind
var callbackList = [];  // A list of functions to call in order.

function doNextCallback() {
  if (callbackList.length) {
    var f = callbackList.shift(); // Get the next callback function
    window.setTimeout(f);         // Give breathing space.
  }
}

// Set up our callbacks
callbackList.push(f1);
callbackList.push(f2);
callbackList.push(f3);

// Start it happening.
doNextCallback();          


function f1() {
  console.log("Busy busy");
  doNextCallback();
}

function f2() {
  console.log("Busy busy");
  doNextCallback();
}
function f3() {
  console.log("Busy busy");
  doNextCallback();
}

私はそれをすべて素敵なオブジェクトにまとめましたが、あなたはそのアイデアを理解しています.

これにより、コールバックを再配置したり、テスト目的で大きなループでコールバックを 2 つだけ呼び出したりすることも非常に簡単になりました。

于 2013-01-17T17:55:04.577 に答える