我正在嘗試使用“請求”從許多 URL 獲取一些資料,但我無法一次只處理一個 URL。
我試圖理解異步/承諾以使其作業,但沒有成功。反復試驗沒有用。
我見過使用不同模塊的其他方法,但這需要重寫我的大部分代碼,我相信有一種更簡單的方法可以使其適應我當前的代碼。
這是代碼的最小化版本:
const request = require('request');
const fs = require('fs');
const prod = fs.readFileSync('prod.txt', "utf8");
const prodid = prod.split("|");
var i;
var summary=[];
for (i=0;i<prodid.length;i ){
request('https://www.api.example.com/id=' prodid[i], { json: true }, (err, res, body) => {
if (err) { return console.log(err); }
if (body == 'NULL') {
console.log("Page " i " out of " prodid.length " is NULL!");
} else {
summary.push(body.items[0].Name);
summary.push(body.items[0].ISOnr);
summary.push(body.items[0].GTIN);
console.log("Page " i " out of " prodid.length " is done!");
fs.appendFileSync('data.txt',JSON.stringify(summary));
}
});
}
上面的示例中沒有涉及異步/承諾,只有回圈內的請求。
據我所知,當我得到結果時,沒有特定的順序(可能是先完成的順序)。
在控制臺中,我總是看到 500 頁中的第 500 頁,而不是 1/500、2/500 等。
我想要實作的是按照 URL 的順序發出每個請求(最好在它們之間有 1000 毫秒的延遲)
uj5u.com熱心網友回復:
您可以承諾您的請求:
for (i = 0; i < prodid.length; i ) {
const result = await new Promise((resolve, reject) =>
request(
'https://www.api.example.com/id=' prodid[i],
{ json: true },
(err, res, body) => {
if (err) {
reject(err);
}
if (body == 'NULL') {
console.log('Page ' i ' out of ' prodid.length ' is NULL!');
} else {
resolve(body);
}
}
)
);
if (result) {
summary.push(result.items[0].Name);
summary.push(result.items[0].ISOnr);
summary.push(result.items[0].GTIN);
console.log('Page ' i ' out of ' prodid.length ' is done!');
fs.appendFileSync('data.txt', JSON.stringify(summary));
}
}
uj5u.com熱心網友回復:
注意:該request模塊已被棄用,您不應再使用它(請參閱https://github.com/request/request/issues/3142)。
話雖如此……您可以將 包裝request在一個承諾中并在您的回圈中等待這個承諾。像(當然仍然需要錯誤處理):
for (const currentProdId of prodid) {
// requests will now be sent one after the other
await sendRequest(currentProdId);
}
function sendRequest(prodId) {
return new Promise((resolve, reject) => {
request('https://www.api.example.com/id=' prodId, {json: true}, (err, res, body) => {
if (err) {
console.log(err);
return reject(err);
}
// ... rest of your code, make sure to resolve the promise once you're done
resolve();
});
});
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/344689.html
