0

我有以下模式,通过它们的回调将函数 1、2 和 3 串在一起。

假设功能 1、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

如果我理解正确,您需要将回调组织成一个链。看看责任链模式。

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

于 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();
}

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

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

于 2013-01-17T17:55:04.577 回答