如何在不使用I / O的情况下使javascript自定义异步功能?

时间:2018-07-19 09:48:16

标签: javascript asynchronous

我有下面的JS代码,我想使其成为异步行为,但它的行为不像异步。我也传递了一个回调,以使其表现得像回调。 请建议如何在不使用settimeout函数或任何http请求的情况下进行异步。

console.log('1');
cc('', function(d){ 
    console.log(d); 
});
console.log('3');

function cc(err, callback){
    for(var i=1; i<=900000000; i++){}

    console.log(i);
    if(typeof callback == 'function'){
        callback('2.5');
    }
}

//输出结果

1
900000001
2.5
3

//预期

1
3
900000001
2.5

1 个答案:

答案 0 :(得分:2)

异步函数唯一有用的时间是主线程必须等待等待某事。

您的示例有一个循环(虽然没有任何实际意义,但是要做很多工作……请注意,“工作”不是“等待”)。

您不能真正使其异步(因为仍需要完成工作,这将使JS引擎忙于运行它)。

最接近的可能是将工作分配给JS主线程以外的其他对象(例如(并且这些选项中的哪个取决于您在其中运行代码的JS环境:JS没有本地方法),您可以在其他服务器上运行它,并通过ZeroMQ或HTTP与之通信,或者您可以使用Web Worker),然后具有一个异步功能,该功能将请求发送到“其他”,并在收到响应后解决。