如何在不访问 Promises 或 Async/Await 之类的东西的情况下创建自己的异步函数? 我很容易找到使用这些编写此类内容的示例,但它需要更新版本的 Javascript。我想知道如果没有这些新功能,您将如何编写此类内容。
例如,当我编写一个接受回调的函数时
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
是为了模拟一个冗长的过程,例如通过串行发送和接收或解析大量数据,一个可能有一个长时间运行的循环并且没有设置预期完成时间超越“最终”。
那么我如何在没有 Promises 的情况下实现异步呢?
最佳答案
您的代码不是异步的。 while 循环处于阻塞状态,因此该函数不会结束,并且不会执行较高调用堆栈中的以下 console.log。您也可以使用异步函数获得相同的行为。这并不是说 promises 会自动将所有内容变成异步代码。您可以使用真正的异步:
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);
关于javascript - 异步 JS Pre-Ecma2015,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45763281/