javascript - 异步 JS Pre-Ecma2015

标签 javascript node.js asynchronous

如何在不访问 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/

相关文章:

javascript - 我试图将 Seriously.js 导入 meteor 应用程序,我收到一个对象类型错误

javascript - 无法连接到安全 socket.io 服务器 : ERR_SSL_PROTOCOL_ERROR

javascript - 如何使rails View 页面上的所有图像异步加载?

javascript - 用更有效的东西替换 if else if 语句

javascript - Backbone View 属性返回未定义

javascript - 如何将 promise resolve() 转移到另一个 promise

javascript - 谷歌地图有多个位置

node.js - 无法在 Windows 上使用 fs 写入文件

node.js - 通过 Node 请求包递归使用 async/await

swift - UITableViewCell 异步加载图像问题 - Swift