2011-09-17 10 views
0
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); 
}; 

は私のコードです。しかし、drainを実行すると、itemIdsは空白として表示されます。これはのモジュールを使用しています。非同期タスクの可変スコープとは何ですか?

+0

を使用してコードを簡素化する個人的にお勧めしますが、間違ったご使用して 'async.queue'のようですね。 – Raynos

答えて

2

私はあなたが重くafter

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); 
    }); 
}); 
+0

ニース!私はフロントのタスク数を指定する必要はありません。それは少し制限されているようです。明らかにこの場合は問題ではありませんが、一般的に、事実の後にcbオブジェクトにタスクを追加する方法がある方が好きです。それをサポートしていますか? – broofa

+0

@broofa nope。静的な数の要求の後に実行された後。その考えは、Nが未定のN個のタスクを待つことが悪い設計であるということです。私はNを知らないN個のタスクを待つ必要は全くありませんでした。是非一例を挙げてください。 – Raynos

+0

の後にリファクタリングします。以前の質問では、1k db操作私は非同期をお勧めします。彼はasync.whilstとasync.untilも使うことができます。 async.queueは、タスクを同時に実行できる場合に便利です。私はもっ​​と大きな疑問は、なぜ彼がNodeで非常に多くの操作をしようとしているかということです。 –

1

問題は可変スコープではありません。async.queueはスケジューリングしているすべての非同期関数についてはわかりません。具体的には、item.save()呼び出しについてはわかりません。 item.save()という外部関数についてのみ知っています。実際の保存と結果のコールバック呼び出しは、drain()が呼び出された後に非同期で行われます。そのため、itemIdsが空に見えます。 (意味がありますか?)

これを解決するには、asyncの代わりにStep moduleを使用することをおすすめします。具体的には、ステップのgroup()の機能を参照してください。これにより、このようなネストされた非同期制御フローがいつ終了するかを指定できます。

関連する問題