我有下面的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
答案 0 :(得分:2)
异步函数唯一有用的时间是主线程必须等待等待某事。
您的示例有一个循环(虽然没有任何实际意义,但是要做很多工作……请注意,“工作”不是“等待”)。
您不能真正使其异步(因为仍需要完成工作,这将使JS引擎忙于运行它)。
最接近的可能是将工作分配给JS主线程以外的其他对象(例如(并且这些选项中的哪个取决于您在其中运行代码的JS环境:JS没有本地方法),您可以在其他服务器上运行它,并通过ZeroMQ或HTTP与之通信,或者您可以使用Web Worker),然后具有一个异步功能,该功能将请求发送到“其他”,并在收到响应后解决。