【问题标题】:JavaScript async non-blocking functions without process无进程的 JavaScript 异步非阻塞函数
【发布时间】:2012-11-28 02:54:54
【问题描述】:

我在 stackoverflow 上阅读了一些关于此主题的问题,但似乎没有一个回答我的疑问。

我知道如何使用process.nextTick 创建异步函数:

var async_function = function(val, callback){
    process.nextTick(function(){
        callback(val);
    });
};

我也读过Promise,但是如何在不使用 process、Promise 等库的情况下编写异步非阻塞函数?

什么是原生方式?我首先想到了这种方法:

var async = function(val, cb) {
    cb(val);    
}

但是,该功能块:

async(3, function(val) {
    console.log(val);
});
console.log(4);
// returns:
3
4

那么正确的实现是什么?如果不依赖这些库,我如何编写异步函数?

【问题讨论】:

  • 我知道你真的不想要一个 API,但我最近偶然发现了这个关于 javascript 响应式扩展的视频,发现它很吸引人。为什么要重新发明轮子? channel9.msdn.com/Blogs/codefest/…
  • 请记住,“异步”和“非阻塞”不是一回事。按照这些答案中的说明(process.nextTicksetTimeout 等),回调将异步触发,但一旦开始运行,它仍将阻塞事件循环。

标签: javascript node.js


【解决方案1】:

您可以使用setTimeout - 它的原生功能就像延迟一样。

【讨论】:

  • 值得注意的是,如果您只针对 Node.js,process.nextTick(func)setTimeout(func, 0) 效率更高,并且对于大多数实际目的而言,执行完全相同的操作。见nodejs.org/docs/latest/api/…
  • 谢谢。你是对的,但问题是 - 如何在纯 js 上执行异步功能。
  • 绝对!评论是给其他读者的,不是给你的。 :)
【解决方案2】:

在 Node.js 上,您需要使用 process.nextTick。在浏览器中,您可以使用postMessage hack,它比setTimeout(function(){},0) 效率更高。

这是postMessage hack 的跨浏览器实现:https://github.com/timoxley/next-tick/blob/master/index.js

【讨论】:

    【解决方案3】:

    将函数的工作分解成块,并在当前块完成后使用process.nextTick 将下一个块排队。这样,您就可以在每个工作块之间执行其他排队的回调。当所有块都完成后,调用作为参数传递给函数的回调。

    以上假设您的函数没有调用现有的异步 API,这自然会使您的函数异步而无需做任何特殊的事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-07
      • 2018-04-06
      • 2020-03-29
      • 1970-01-01
      • 2020-10-28
      • 1970-01-01
      • 2015-08-03
      相关资源
      最近更新 更多