【问题标题】:Is async.each non-blocking? node.jsasync.each 是非阻塞的吗?节点.js
【发布时间】:2015-10-11 14:36:21
【问题描述】:

我想用对象对数组进行非阻塞循环,所以我使用了 async.each 函数:

log.info("before");

async.each(products , function(prdt, callback){
    for(var i = 0 ; i <4000000000; i++){
        var s = i;
    }
    console.log("inside");
    callback();

}, function (err) {
    console.log("end");
});
log.info("after");

所以如果我运行上面的代码,我会输出这样的消息:

before
inside
....
inside
end
after

如果 async.each asynchoronous 为什么我看不到该顺序的输出?

before 
after
inside 
inside..
end 

更新1: thx 的答案,但如果我想在我的路由器中执行该代码,我会阻止对我的服务器的所有响应?我需要改变什么?

【问题讨论】:

  • “我需要改变什么?” --- 一种编程语言。 JS(准确地说是它的用户区)在单线程中运行。
  • 那么,我怎样才能异步遍历数组并且不阻止用户对我的服务器的响应?
  • 你不能。 JS 是单线程的。因此,每当您运行这个 CPU 密集型代码时,其他一切都会等待。
  • 所以无论我使用简单的 'products.forEach' 还是 async.each?当我遍历数组时,我阻塞了我的整个服务器?

标签: javascript node.js async.js


【解决方案1】:

在我看来,async.each 函数只是暗示它可以用于异步操作,因为它固有地包含一个回调函数(这对于您将自己添加到自己的函数中是微不足道的)。

考虑这段代码,它使用 Mongoose(一个 MongoDB 包装器)来模拟真实世界的异步调用:

console.log("before");

async.each(["red", "green", "blue"], function(color, cb) {

    mongoose.model('products')
        .find({color: color})
        .exec(function(err, products) {
            if (err) return cb(err); // will call our cb() function with an error.
            console.log("inside");
            cb(null, products);
        });

}, function(err, products) {
    if (err) return console.error(err);
    console.log("really after");
    console.log(products);
});

console.log("after");

你会得到

before
after
inside
really after
[red products]
inside
really after
[green products]
inside
really after
[blue products]

为什么有意义?让我知道我是否可以进一步分解。

【讨论】:

  • 是的,你给了我我想看的东西。
【解决方案2】:

async.each() 是异步的,但你没有做任何阻塞或需要异步循环的事情。如果您将 setTimeout() 放在那里,您会看到它按预期工作。

【讨论】:

  • "async.each() 是异步的" --- 这到底是什么意思?我提供了一个指向源的链接,该链接声明它同步运行回调
  • “如果你把 setTimeout() 放在那里,你会看到它像你期望的那样工作。” --- 如果你还需要setTimeout(),那么使用async.each 有什么意义?
  • setTimeout() 只是一个触发异步事件的代码示例。也就是说,函数内部的setTimeout() 本质上意味着某些代码将在未来的事件循环中运行,即使包装setTimeout() 调用的函数将立即返回。
猜你喜欢
  • 2016-09-18
  • 1970-01-01
  • 2018-02-09
  • 1970-01-01
  • 1970-01-01
  • 2016-08-05
  • 1970-01-01
  • 2023-03-19
  • 2015-11-06
相关资源
最近更新 更多