5

私はaync.parallelを使用して2つの関数を並列に実行しています。関数はRSSフィードを要求します。その後、RSSフィードが解析され、私のWebページに追加されます。Node.JS async.parallelは、すべてのタスクが完了するまで待機しません。

しかし、2つの関数はタスクが完了したら、結果を配列として最終 コールバックに渡され

The documentation says:

を完了するまで、何らかの理由async.parallelを待たずにコールバックメソッドを実行します。

マイコード。

require('async').parallel([ function(callback) { 
     fetchRss(res, bbcOpts); // Needs time to request and parse 
     callback(); 
    }, function(callback) { 
     // Very fast. 
     callback(); 
    } ], function done(err, results) { 
     if (err) { 
      throw err; 
     } 
     res.end("Done!"); 
    }); 

実際には「完了」しかありません。私のウェブページに。どうして?

なぜres.end()に電話する必要がありますか?

Node.JS documentationは言う:

方法、Response.Endの()、各応答に呼び出されなければなりません。

私がそれを呼んでいないと私のウェブページは "ダウンロード"されます(私はブラウザのアドレス行にプログレスバーを表示しています)。

答えて

9

fetchRss関数が非同期であると仮定します:isは後で実行され、コールバックがただちに呼び出されます。あなたがfetchRssにコールバックを送信しなければならない:サイドノートで

function fetchRss(res, bbcOpts, callback) { 
    doSomething(); 
    callback(); 
} 

require('async').parallel([ function(callback) { 
     fetchRss(res, bbcOpts, callback); // Needs time to request and parse 
    }, function(callback) { 
     // Very fast. 
     callback(); 
    } ], function done(err, results) { 
     if (err) { 
      throw err; 
     } 
     res.end("Done!"); 
    }); 

を、次のメッセージが完了し、すべて(ヘッダ+ボディ)が書き込まれたことを知っているノードのためにres.end()を呼び出す必要があります。それ以外の場合、ソケットは開いたままになり、別のメッセージが永久に待機します(ブラウザにプログレスバーが表示される理由:要求が終了したことを知らないためです)。

関連する問題