我正在嘗試向串列中的每個 url 發出多個 http 請求(使用 axios)。一旦單個請求得到解決,我想向根據前一個請求的回應構造的 url 發出另一個請求。最后,當所有次要請求都得到解決時,我想對他們的所有回應做一些事情。
我試圖按如下方式完成此操作:
let promises = [];
urls.forEach(url => {
const promise = axios.get(url);
promise.then(response => {
promises.push(axios.get(response.data.url))
});
});
Promise.all(promises).then(responses => {
// do something with responses
})
我希望在.then(responses => {})觸發時決議所有輔助 url 請求的回應,但是當此代碼觸發時,回應陣列為空。
我怎樣才能實作這樣的目標?
uj5u.com熱心網友回復:
將嵌套回傳axios.get到映射回呼,以便首先Promise.all等待所有嵌套請求完成。
Promise.all(
urls.map(
url => axios.get(url).then(
response => axios.get(response.data.url)
)
)
)
.then((results) => {
// ...
})
uj5u.com熱心網友回復:
考慮到第一個promise.then()陳述句是異步的,這是合乎邏輯的。所述urls.forEachalthoughy看似異步的,它是同步的。因此在Promise.all()將任何承諾推送到您的陣列之前呼叫 。
你可以這樣設定:
let promises = [];
urls.forEach(url => {
promises.push(axios.get(url).then((response) => {
return axios.get(response.data.url);
});
});
Promise.all(promises).then(responses => {
// do something with responses
});
這將.then()直接鏈接到第一個 axios 請求上,然后將其推送到 promises 陣列上。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/317088.html
標籤:javascript 循环 异步 承诺 公理
