プロバイダーからページのリストからデータを取得する必要がある node.js アプリを作成しています。
var list = [
{ url: 'http://www.example.com/1' },
{ url: 'http://www.example.com/2' },
...
{ url: 'http://www.example.com/N' },
];
現在、うまく機能するasync.eachを使用しています。
async.each(
list, // 1st param is the array of items
function(elem, callback) { // 2nd param is the function that each item is passed to
request(elem.url, function (error, response, body) {
if (!error && response.statusCode == 200) {
console.log(body);
}
}),
},
function(err) { // 3rd param is the function to call when everything's done
if (err) {
console.error('Error in the final async callback:', err);
}
}
);
唯一の問題は、時間単位で同じ IP からのリクエストが過剰に発生したため、サイトのサーバーが (当然のことながら) 403 (禁止) ステータス コードで応答することがあることです...
メソッドもasync
提供されているようです。その例は次のとおりです。whilst()
var count = 0;
async.whilst(
function () { return count < 5; },
function (callback) {
count++;
setTimeout(callback, 1000);
},
function (err) {
// 5 seconds have passed
}
);
しかし、それをリストで使用する方法、またはそれを組み合わせて使用する方法がわかりませんasync.each
... :-(
答えは次のとおりです: node.js で非同期リクエストのリストを制限 (スロットル) するにはどうすればよいですか?
PS:より明確にするために、(可能であれば) リクエストをキューに入れたくありません。リクエストが完了するまでに長い時間がかかる可能性があるためです...:定義された時間間隔でリクエストを開始したいだけです(たとえば 5リクエストごとに ~ 10 秒...)。
アップデート:
alireza david のコメントの後、私は async.eachLimit を使用してみました。これは非常に有望に見えました...これは、モジュール githubサイトでの使用例です。
async.eachLimit(
obj.files,
limit
function (file, complete) {
complete();
},
function (err) {
}
);
しかし、制限の使用法は文書化されておらず、私には明らかではありません...誰かが手掛かりを持っているなら...