Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Ecma2015之前的异步JS_Javascript_Node.js_Asynchronous - Fatal编程技术网

Javascript Ecma2015之前的异步JS

Javascript Ecma2015之前的异步JS,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,如果不访问Promises或Async/Await之类的东西,如何创建自己的异步函数? 我很容易找到使用这些代码编写此类内容的示例,但它需要更新版本的Javascript。我想知道如果没有这些更新的功能,你是如何写这些东西的 例如,当我编写一个接受回调的函数时 let wait5=函数(回调){ 让expire=Date.now()+5000; while(Date.now()

如果不访问Promises或Async/Await之类的东西,如何创建自己的异步函数? 我很容易找到使用这些代码编写此类内容的示例,但它需要更新版本的Javascript。我想知道如果没有这些更新的功能,你是如何写这些东西的

例如,当我编写一个接受回调的函数时

let wait5=函数(回调){
让expire=Date.now()+5000;
while(Date.now()<到期){
}
log(“等待5秒!”)
如果(回调)
回调();
}
wait5(函数(){
log(“等待5秒后调用”)
});

log(“这应该在5秒之前记录”)您的代码不是异步的。while循环被阻塞,因此函数不会结束,并且不会执行更高调用堆栈中的以下console.log。异步函数也有同样的行为。并不是承诺自动将所有内容转换为异步代码。您可以使用真正的异步:

function wait5(callback){
  setTimeout(function(){
   console.log("Waited 5 seconds!")
   if(callback) callback();
  },5000);
}
这也适用于循环。而不是:

 for( var i = 0; i < 1000000; i++) sth(i);
(变量i=0;i<1000000;i++)某事物(i);
我们可以做到:

 (function next(i){
   sth(i);
   if(i < 1000000 - 1) setTimeout(next,0,i+1);
  })(0);
(功能下一步(i){
某物(i);
如果(i<1000000-1)设置超时(next,0,i+1);
})(0);

您可以使用
Worker
窗口
之外执行任务,
Worker.postMessage()
向创建
Worker
实例的
窗口
发送
消息
事件。

。。事实上,你已经找到了解决办法。。没有30000种方法可以创建异步函数回调(回调不一定是异步的,它只是一个在另一个函数完成时调用的函数,如果您只进行同步,它就不是异步回调),但是setTimeout就是其中之一&这就是您必须做的

这是一个简短的可能性列表


那么,没有承诺,但有arrow funcs/异步并不意味着“两件事同时发生”,这就是你错的地方。这意味着任务计划在当前阻塞进程完成后的稍后时间在线程中发生。在单线程JavaScript中,从来没有“两件事同时发生”。如果没有第三个观察者,您如何可能验证两个活动或事件同时发生?JavaScript异步操作不是量子计算。你显然误读了,甚至谷歌说“(两个或多个对象或事件)不存在或不同时发生。”(重点补充)以及定义,正如我指出的,“属于或需要一种形式的计算机控制定时协议,在该协议中,一个特定的操作在接收到一个指示(信号)后即开始,该指示(信号)表明前面的操作已经完成。“@MagicMarbles我明确解释了为什么示例代码中没有使用setTimeout。@magic marbles可能会使用setTimeout来减慢循环速度??并使其异步我尝试过将0作为第二个参数传入,如您所示。老实说,我没有想到用零设置超时!它当然可以工作,修改我的wait5()函数以使用它会给出console.log输出的预期顺序。看起来有点老套,老实说,我希望像将函数标记为异步,而不是将计时器设置为零持续时间。但是它确实有效。@magic marbles well实际上setTimeout 0是将代码推送到事件队列的一种常见方法。如果我们没有设置计时器,但是有一个非常长的运行函数,没有确切的运行持续时间,它会一直运行到完成,然后再调用。就像解析/序列化一个大文件,在串行端口上等待响应等等。我认为您没有正确理解异步,它不是异步的,只是因为它是一个很长的过程。它在节点中是异步的,因为它是在异步中实现的,所以在代码中不做任何异步的事情。