我有一組用戶,其中每個用戶都有一個 IP 地址。
我有一個 API,我將一個 IP 作為請求發送,它回傳一個屬于該 IP 的縣代碼。
為了獲得每個用戶的國家/地區代碼,我需要向每個用戶發送單獨的請求。
在我的代碼中,我執行 async await,但需要大約 10 秒才能獲得所有回應,如果我不執行 async await,則根本無法獲得國家/地區代碼。我的代碼:
async function getAllusers() {
let allUsersData = await usersDao.getAllusers();
for (let i = 0; i < allUsersData.length; i ) {
let data = { ip: allUsersData[i].ip };
let body = new URLSearchParams(data);
await axios
.post("http://myAPI", body)
.then((res) => {
allUsersData[i].countryCode = res.data.countryCode;
});
}
return allUsersData;
}
uj5u.com熱心網友回復:
您可以使用Promise.all一次提出所有請求,而不是一一提出。
let requests = [];
for (let i = 0; i < allUsersData.length; i ) {
let data = { ip: allUsersData[i].ip };
let body = new URLSearchParams(data);
requests.push(axios.post("http://myAPI", body)); // axios.post returns a Promise
}
try {
const results = await Promise.all(requests);
// results now contains each request result in the same order
// Your logic here...
}
catch (e) {
// Handles errors
}
uj5u.com熱心網友回復:
如果您只是想更快地獲得所有結果,您可以并行請求它們并知道它們何時全部完成Promise.all():
async function getAllusers() {
let allUsersData = await usersDao.getAllusers();
await Promise.all(allUsersData.map((userData, index) => {
let body = new URLSearchParams({ip: userData.ip});
return axios.post("http://myAPI", body).then((res) => {
allUsersData[index].countryCode = res.data.countryCode;
});
}));
return allUsersData;
}
請注意,如果allUsersData陣列很大(例如超過 20 個),我不建議這樣做,因為您將在目標服務器上發出大量請求,這可能會影響其性能,或者您可能會受到速率限制或甚至拒絕服務。在這種情況下,您需要使用類似pMap() here或mapConcurrent() here 的代碼一次發送 N 個請求(例如可能是 5 個)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/369152.html
上一篇:如何通過CSS使SVG元素影片化
