如何在不使用I/O的情况下实现javascript自定义异步函数?

如何在不使用I/O的情况下实现javascript自定义异步函数?,javascript,asynchronous,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++){} conso

我有下面的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
3
900000001
2.5

异步函数唯一有用的时间是当主线程必须等待某些东西时

您的示例有一个循环(它不做任何实际的事情,但需要做很多工作……请注意,“工作”不是“等待”)

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


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

回调只是作为参数传递的函数引用。使用回调不会使代码异步。如果不执行任何异步操作,为什么需要代码是异步的?实际上,我想知道如何使js代码异步。非常感谢您的帮助。那么您基本上想要将同步阻塞操作转换为异步阻塞操作?在浏览器中?然后使用webworkers.yes@Razem你是对的。如何工作,console.log('start');setTimeout(function(){console.log('inside')},2000);console.log('end')@AmitSingh-请参见此答案的第一句
setTimeout
正在等待某些信息(在这种情况下需要2秒)。
1
3
900000001
2.5