Какова область переменной для асинхронных задач? - PullRequest
0 голосов
/ 17 сентября 2011
var itemIds, result, taskQueue, _i, _len;
itemIds = [];
taskQueue = async.queue(function(task, callback) {
  console.log('Hello ' + task.name);
  return callback();
}, 10);
for (_i = 0, _len = results.length; _i < _len; _i++) {
  result = results[_i];
  taskQueue.push({}, function(err) {
    var item;
    item = new Item(result);
    return item.save(function(err, new_item) {
      itemIds[itemIds.length] = new_item._id;
      console.log(new_item._id);
      return console.log(itemIds);
    });
  });
}
taskQueue.drain = function() {
  console.log('Queue Done!');
  return console.log(itemIds.length);
};

- мой код.Но itemIds показывается пустым при запуске drain.Это использует модуль async для node.js кстати

Ответы [ 2 ]

2 голосов
/ 17 сентября 2011

Я лично рекомендую вам сильно упростить код, используя после

var slice = Array.prototype.slice;

var cb = after(results.length, function() {
    var items = slice.call(arguments);
    console.log("All done");
    console.log(items.length);
});

results.forEach(function(result) {
    item = new Item(result);
    item.save(function(err, newItem) {
        cb(newItem);   
    }); 
});
1 голос
/ 17 сентября 2011

Проблема не в переменной области, а в том, что async.queue не знает обо всех асинхронных функциях, которые вы планируете.В частности, он не знает о вызовах item.save () - он знает только о внешней функции, которую планирует item.save ().Фактическое сохранение и результирующий вызов обратного вызова выполняются асинхронно, после того как вызвана dump (), поэтому itemIds выглядит пустым.(Имеет смысл?)

Чтобы решить эту проблему, я бы предложил вам использовать Step module вместо async.В частности, обратите внимание на функцию шага group(), которая позволяет указать, когда вложенные асинхронные потоки управления, подобные этому, закончились.

...