如何改进以下回调模式?

时间:2013-01-17 17:44:40

标签: javascript function design-patterns callback

我有以下模式,通过回调将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);
}

2 个答案:

答案 0 :(得分:1)

如果我理解正确,您需要在链中组织回调。看看Chain of Responsibility模式。

因此,您将创建一个包含要执行的函数的对象,并在需要时执行回调函数。

答案 1 :(得分: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();
}

我把它全部包裹在一个漂亮的物体中,但你明白了。

这也使得重新安排回调或在一个大循环中只调用其中两个进行测试非常容易。