私はJavascriptで始まりましたが、forループをループしているときにこのコードを同期させるにはどうすればいいですか? 基本的には、ループ内で複数のPOSTリクエストを作成してから、ライブラリX-Rayを使用してデータをスクラップし、結果をMongoデータベースに保存しています。 出力はOKですが、順不同で突然ハングアップするので、Ctrl + Cを押して強制的に閉じる必要があります。これは私の関数である:ノードjsとfoorループでの同期複数要求
function getdata() {
const startYear = 1996;
const currentYear = 1998; // new Date().getFullYear()
for (let i = startYear; i <= currentYear; i++) {
for (let j = 1; j <= 12; j++) {
if (i === startYear) {
j = 12;
}
// Form to be sent
const form = {
year: `${i}`,
month: `${j}`,
day: '01',
};
const formData = querystring.stringify(form);
const contentLength = formData.length;
// Make HTTP Request
request({
headers: {
'Content-Length': contentLength,
'Content-Type': 'application/x-www-form-urlencoded',
},
uri: 'https://www.ipma.pt/pt/geofisica/sismologia/',
body: formData,
method: 'POST',
}, (err, res, html) => {
if (!err && res.statusCode === 200) {
// Scrapping data with X-Ray
x(html, '#divID0 > table > tr', {
date: '.block90w',
lat: 'td:nth-child(2)',
lon: 'td:nth-child(3)',
prof: 'td:nth-child(4)',
mag: 'td:nth-child(5)',
local: 'td:nth-child(6)',
degree: 'td:nth-child(7)',
})((error, obj) => {
const result = {
date: obj.date,
lat: obj.lat.replace(',', '.'),
lon: obj.lon.replace(',', '.'),
prof: obj.prof == '-' ? null : obj.prof.replace(',', '.'),
mag: obj.mag.replace(',', '.'),
local: obj.local,
degree: obj.degree,
};
// console.log(result);
upsertEarthquake(result); // save to DB
});
}
});
}
}
}
私は約束やコールバックを使用する必要がありますが、私はこれを行う方法を理解できないと思いますし、私はすでに待っていますが、成功しません非同期を使用してみました。追加情報を提供する必要がある場合は、感謝してください。
を使用している場合、私はそれを実装しようとしたが、それはもうハングしないにも関わらず、出力はまだ、順不同ています。あなたは私が何をしたかここで見ることができますhttps://pastebin.com/J0PdG9rv –
@MiguelFerreiraあなたはそれを持っています。この情報を使って、非同期コールバックを連結する方法を作成しました。それはクールですが、まだ問題があります。別の非同期要求内に非同期要求があります。 'request'コールバックの中では' x'を呼び出します。これには非同期コールバックもあります。すべての非同期コールバックが完了したら、次のリクエストを実行します。私はあなたのペーストビンをちょっと微調整しました:https://pastebin.com/keshVjXxあなたが望む結果を得た直後に、私が 'getdata'をどこで呼び出すかチェックしてください。この時点で完了し、次のリクエストを続行できます。 –
'x'関数を呼び出さないようなエラーや何かが得られた場合、次のリクエストを続行しないことに注意してください。これがあなたが実際に望むものなのかどうか考えてみてください。おそらく、このような状況が発生した場合は、要求を繰り返すか、最初からやり直すことができます。それはあなた次第です。ちょうど 'else'を追加して、"要求チェーン "が壊れた場合に実行したいコードを追加してください。 –