2015-07-21 2 views
4

Я хочу, чтобы неблокирующая цикл по массиву с объектами, так что я использовал async.each функции:Является ли async.each неблокирующим? Node.js

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 

Update1: ТНХ для ответов, но если я хочу, чтобы выполнить этот код внутри моего маршрутизатора, я заблокировала все на мой Свои замечания сервер? Что мне нужно изменить?

+0

https://github.com/caolan/async/blob/4101af3f402008ea82c8de38ec3bd852aa3d7565/lib/async.js#L230 – zerkms

+0

«Что мне нужно изменить?» --- язык программирования. JS (его пользовательское пространство, если быть точным) работает в одном потоке. – zerkms

+0

Итак, как я могу асинхронно выполнять ассемблерный массив и не блокировать пользовательские ответы на моем сервере? – MeetJoeBlack

ответ

2

Мне кажется, что функция async.each просто подразумевает, что она может использоваться для асинхронных действий, поскольку она по своей сути включает функцию обратного вызова (что тривиально для вас, чтобы добавить себя в свою собственную функцию).

Рассмотрим этот код, который использует Мангуст (обертку 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] 

смысл почему? Дайте мне знать, могу ли я сломать все это дальше.

+0

Да, вы даете мне то, что я хочу видеть. – MeetJoeBlack

0

async.each() является асинхронным, но вы не делаете ничего, что блокирует или требует асинхронный цикл. Если вы разместите setTimeout() там, вы увидите, что он работает так, как вы ожидаете.

+2

"async.each() является асинхронным" --- что это означает? Я предоставил ссылку на источник, в котором говорится, что он выполняет обратный вызов синхронно. – zerkms

+1

«Если вы разместите setTimeout() там, вы увидите, что он работает так, как вы ожидаете». --- Какой смысл использовать 'async.each', если вам все еще нужно' setTimeout() '? – zerkms

+0

'setTimeout()' просто пример кода, запускающего асинхронное событие. То есть, 'setTimeout()' внутри функции по своей сути означает, что какой-то код будет запущен в будущем цикле событий, даже через функцию, которая завершает вызов 'setTimeout(), немедленно вернется. –

Смежные вопросы