不阻止的回调

时间:2013-07-19 15:53:09

标签: javascript asynchronous callback

我想写一个函数,它接受一个回调并在函数完成后调用它。

这很简单:

var callback = function (ref) {
    var i = 1337;
    while (i--) {
        console.log(ref, 'callback');
    }
};

var someFoo = function (ref, callback) {
    console.log(ref, 'self');

    callback(ref);
}

someFoo('one', callback); // 1
someFoo('two', callback); // 2

但在这里我遇到了这个问题:首先someFoo调用阻塞,直到allback完成。这意味着此代码等同于此(在每个函数完成之前阻塞):

someFoo('one');
callback('one');
someFoo('two');
callback('two');

现在的问题是:如何使回调调用异步?

2 个答案:

答案 0 :(得分:9)

变化:

callback(ref);

要:

setTimeout(function(){ callback(ref); }, 0);

或者,由于您正在编写Chrome扩展程序,因此不必担心旧浏览器,因此您可以使用bind

setTimeout(callback.bind(null, ref), 0);

答案 1 :(得分:2)

在浏览器中实现的JavaScript是单线程的,因此您无法进行真正的异步调用。你可以做的就是这样来近似:

setTimeout(function() {
    callback(ref);
}, 1000);

其中1000是1秒(以毫秒为单位)(根据需要进一步延迟)。但是,由于它是单线程的,回调仍将阻止正在运行的其他代码。

新版浏览器支持web workers,但使用网络工作人员来估算线程将会为您留下不适用于许多旧版浏览器的代码,而且即使是现在也不是所有新版浏览器都支持完整规范。