如何在JavaScript中处理多个回调

时间:2013-08-20 16:19:42

标签: javascript

我如何处理多个回调?现在只有我注册的第一个被解雇..

这是我当前处理回调的代码(此代码正在加载异步)

var widget = function () {
    var onNameCallback,
    onTriggedCallback;    


    function getName(callback) {
        onNameCallback = callback;
    }

    function onTrigg(callback) {
        onTriggedCallback = callback;
    }


    /** lots of code ... **/


    if(typeof onNameCallback == 'function') {
        // Fire the callback
        onNameCallback('1');
    }   

    if(typeof onTriggedCallback == 'function') {
        // Fire the callback    
        onTriggedCallback('hello');
    }   


    /** lots of code ... **/    

    return {
       getName:getName,
       onTrigg:onTrigg,
    };
}();

if (window._test) {
    for (var i = 0; i < _test.length; i++) {        
        var method = _test.shift();
        try {
            widget[method].apply(widget, _test);
        } catch (err) {
            console.log(err);
        }
        var method = _test.shift();
    }
};

以下是我如何注册它们:

_test.push('getName', function(data) {
    console.log(data);
}); 

_test.push('onTrigg', function(data) {
    console.log(data);
});

但由于某些原因,只有getName被解雇..

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

代码的主要问题是,当您从数组中移动项目时,您正在计算i,以便数组的长度变小。您将循环遍历数组中的一半项目。而只是循环,而数组中还有任何东西。

此外,当您使用apply调用方法并将数组中的所有剩余项目作为参数发送时,您将从数组中移除方法名称两次并忽略一个(实际上是处理程序)。这实际上并没有阻止代码工作,但很难遵循它实际想要完成的任务。从数组中移出两个值,并使用call方法使用单个参数调用该方法。

if (window._test) {
  while (_test.length > 0) {
    var method = _test.shift();
    var handler = _test.shift();
    try {
        widget[method].call(widget, handler);
    } catch (err) {
        console.log(err);
    }
  }
}

编辑:

如果你想在数组中进行每个回调,只需将其从_test数组中移出:

if (window._test) {
  while (_test.length > 0) {        
    var callback = _test.shift();
    try {
        widget[callback[0]].call(widget, callback[1]);
    } catch (err) {
        console.log(err);
    }
  }
}

答案 1 :(得分:0)

我将回调添加到数组中,如:

_test.push(['getName', function(data) {
    console.log(data);
}]); 

_test.push(['onTrigg', function(data) {
    console.log(data);
}]);

并修改:

if (window._test) {
    for (var i = 0; i < _test.length; i++) {        
        var method = _test[i].shift();
        try {
            widget[method].apply(widget, _test[i]);
        } catch (err) {
            console.log(err);
        }
    }
};

现在很棒!

感谢FelixKling!