1

ループしてメッセージをキュー(azureストレージキュー)に追加する小さなテストノードアプリを作成しました。次のようなものです。

var queueService = azure.createQueueService();
var queueName = 'taskqueue';

// other stuff like check if created

// loop called after queue is confirmed

for (i=0;i<1000;i++){
  queueService.createMessage(queueName, "Hello world!", null, messageCreated);
}

// messageCreated does nothing at the moment, just logs to console

並列で実行されるワーカー関数の数を制御するために非同期を使用する100万の作成を処理するように書き直そうとしています。これは何よりも学習演習です。

https://github.com/caolan/async#queue

これはasyncのキューの基本的な設定であり、何を変更する必要があるのか​​途方に暮れています。以下はうまくいかないと思います:

var q = async.queue(function (task, callback) {
   queueService.createMessage(queueName, task.msg, null, messageCreated);
    callback();
}, 100);


// assign a callback.  Called when all the queues have been processed
q.drain = function() {
    console.log('all items have been processed');
}

// add some items to the queue
for(i=0;i<1000000;i++) {
  q.push({msg: 'Hello World'}, function (err) {
    console.log('finished processing foo');
  });
    console.log('pushing: ' + i);
}

私はそれを非同期でまとめる方法を完全には理解していません。

4

1 に答える 1

4

これがあなたのエラーです:

var q = async.queue(function (task, callback) {
   queueService.createMessage(queueName, task.msg, null, messageCreated);
    callback();
}, 100);

あなたがしているのは、キューにメッセージを作成し、その直後に継続を渡します(コールバックを呼び出します)。あなたがしたいのは、に渡されたコールバック内に継続を渡すことですcreateMessage

var q = async.queue(function (task, callback) {
   queueService.createMessage(queueName, task.msg, null, function(error, serverQueue, serverResponse) {
       callback(error, serverQueue, serverResponse);
       messageCreated(error, serverQueue, serverResponse);
   });
}, 100);

これで、各タスクは、タスクが実際に作成された後に終了を報告します。

編集:コールバックのインターフェースを更新しましたcreateMessage

于 2012-06-21T15:49:18.553 に答える