昨日からnode.jsのasync
モジュールを使用して、非同期タスクの順序を処理しています。以下のコードは動作しますが、エラー:Node.js非同期ウォールフォール()コールバックがすでに呼び出されていた
Callback was already called
が約1〜5回表示されます。私はどこに問題があるのかわからない、たぶんforEach
ループのgetNewsTitles()
のコールバックは一度だけではない。だから、console.log
をここに入れますが、エラーが表示されているかどうかにかかわらず、このログは1回だけ印刷されます。
async.waterfall([
function(callback) {
callback();
},
function(callback) {
// When error, below log doesn't show.
console.log('getting news titles...');
getNewsTitles(arr_uri, arr_subs, function() {
// * The problem is here => "Callback was already called"
callback(null);
});
}
], function(err, result) {
if (err) return next();
else res.send(arr_subs);
});
function getNewsTitles(targets, subs, callback) {
targets.forEach(function(current, index) {
request.get({
uri: current,
encoding: null
}, function(err, response, body) {
if (!err && response.statusCode == 200) {
var $ = cheerio.load(iconv.decode(body, 'EUC-KR'));
var subject = $('.articleSubject a');
for (var i = 0; i < subject.length; i++) {
subs.push(subject[i].attribs.title);
}
if (subs.length == (targets.length - 2) * 20 + 2) {
// when error or not, below log shows one time.
console.log('doubt here too');
callback();
}
}
});
})
}
私は何かを逃しましたか?
ありがとう^ - ^それはうまくいく。しかし、私はあなたが** callback()が成功したすべてのrequest.get()を呼び出すと言ったのだろうか。**。しかし、私はこのif(subs.length ==(targets.length - 2)* 20 + 2){callback()によって一度だけ呼び出されるコールバック()を意図していました。 } 'この条件はforループで一度だけ一致します。あなたのコードはうまく動作し、とても感謝していますが、私のコードがエラーを表示した理由を理解できません...新しい質問をする方が良いですか?ありがとう。 – Juntae
私はfiddle https://jsfiddle.net/bexoss/1xqLhqrr/を書きました。私はこれが質問のコードと同じだと思いますが、問題はうまくいきませんが、フィドルコードはうまくいきます。...同じ問題が起こったら、新しい質問をする必要があるかもしれません。 – Juntae
実際、あなたは正しいです...すべての成功したリクエストではありません.get()...私は1番目(エラーをチェックする)を見ましたが、2番目の場合はそれを持っていれば近くに見ていませんでした。 – Ben