asynchronousJS Pre-Ecma2015

如何在不访问Promise或Async / Await之类的情况下创build自己的asynchronous函数? 我没有find使用这些东西写这样的事情的例子,但它需要更新版本的Javascript。 我想知道如果没有这些更新的function,你会怎么写这些东西。

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

let wait5 = function (callback) { let expire = Date.now()+5000; while(Date.now() < expire){ } console.log("Waited 5 seconds!") if(callback) callback(); } wait5(function (){ console.log("Called after waiting 5 seconds") }); console.log("This should log before 5 seconds passes"); 

上面不打印我想要的顺序的日志消息,而是阻止wait5()直到它完成等待。 显然, wait5是为了模拟一个冗长的过程,比如通过串行发送和接收,或者parsing大量的数据,一个可能有一个长时间运行的循环,没有超出'最终'的预期完成时间。

那么如何在没有Promise的情况下使这个asynchronous呢?

你的代码不是asynchronous的。 while循环被阻塞,因此该函数不会结束,并且更高的调用堆栈中的以下console.log不会被执行。 你也会得到与asynchronous函数相同的行为。 它不是那个承诺自动把所有的东西变成asynchronous代码。 你可以使用真正的asynchronous:

 function wait5(callback){ setTimeout(function(){ console.log("Waited 5 seconds!") if(callback) callback(); },5000); } 

这也可以应用于循环。 代替:

  for( var i = 0; i < 1000000; i++) sth(i); 

可以这样做:

  (function next(i){ sth(i); if(i < 1000000 - 1) setTimeout(next,0,i+1); })(0); 

您可以使用Worker来执行window之外的任务Worker.postMessage()以将message事件分派到创build了Worker实例的window

嗡嗡声..其实你有解决scheme..没有30 000方法来创buildasynchronous函数callback(callback不是必要的asynchronous,只是一个函数,当另一个已完成调用,如果你只是同步,这是不是一个asynchronous的callback),但setTimeout是其中之一,这是你如何做到这一点!

这是一个可能性的短名单

https://stackoverflow.com/a/9516967/8395557