1

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

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

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被解雇了..

有任何想法吗?

4

2 回答 2

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);
    }
  }
}
于 2013-08-20T16:35:17.487 回答
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);
        }
    }
};

现在效果很好!

谢谢菲利克斯克林!

于 2013-08-20T16:36:31.610 回答