我有一系列帳戶,有兩個請求,一個是獲取域,另一個是從中獲取帳戶資料。如果我必須獲取所有帳戶資料,我該怎么做?
accountsData = acounts.map(account => {
getDomain(account).then(domain => getData(domain))
})
Promises.all(accountsData).then(e => console.log(e))
由于少數請求全部失敗,因此這是行不通的。
我已經嘗試了上面的 aproch,但當少數請求失敗時它不起作用。
uj5u.com熱心網友回復:
承諾.allSettled
使用 Promise.allSettled 檢查承諾是否已履行或拒絕。
您可以將 promise 推入陣列并在 promise 陣列上使用 Promise.allSettled。
解決方案
for (const account of accounts) {
getDomainPromises.push(getDomain(account));
}
await Promise.allSettled(getDomainPromises).then((getDominResults) =>
getDominResults.forEach((getDomainResult) => {
if (getDomainResult.status === 'fulfilled'){
console.log("GD - " getDomainResult.status, getDomainResult.value);
getDataPromises.push(getData(getDomainResult.value))
} else { // status = 'rejected'
console.log("GD - " getDomainResult.status);
}
})
);
await Promise.allSettled(getDataPromises).then((getDataResults) =>
getDataResults.forEach((getDataResult) => {
if (getDataResult.status === 'fulfilled'){
console.log("getData - ", getDataResult.value)
} else { // status = 'rejected'
console.log("getData - REJECTED");
}
})
);
作業演示:
// Mocking getDomain Promise
function getDomain(a) {
return new Promise((resolve, reject) => {
if (a % 2 === 0) {
setTimeout(resolve, 100, 'RESOLVE - getDomain - ' a);
} else {
setTimeout(reject, 100, 'REJECTED - getDomain - ' a);
}
})
}
// Mocking getData Promise
function getData(a) {
return new Promise((resolve, reject) => {
if (Math.round(Math.random()*100) % 2 === 0) {
setTimeout(resolve, 100, 'RESOLVE - getData - ' a);
} else {
setTimeout(reject, 100, 'REJECTED - getData - ' a);
}
})
}
// SOLUTION::
const accounts = [1, 2, 3, 4];
const getDomainPromises = [];
const getDataPromises = [];
for (const account of accounts) {
getDomainPromises.push(getDomain(account));
}
async function run() {
await Promise.allSettled(getDomainPromises).then((getDominResults) =>
getDominResults.forEach((getDomainResult) => {
if (getDomainResult.status === 'fulfilled'){
console.log("GD - " getDomainResult.status, getDomainResult.value);
getDataPromises.push(getData(getDomainResult.value))
} else { // status = 'rejected'
console.log("GD - " getDomainResult.status);
}
})
);
await Promise.allSettled(getDataPromises).then((getDataResults) =>
getDataResults.forEach((getDataResult) => {
if (getDataResult.status === 'fulfilled'){
console.log("getData - ", getDataResult.value)
} else { // status = 'rejected'
console.log("getData - REJECTED");
}
})
);
}
run();
uj5u.com熱心網友回復:
Promise您需要在地圖的每次迭代中回傳 a
accountsData = acounts.map(account => {
return new Promise((resolve, reject) => {
getDomain(account)
.then(domain => getData(domain)
.then(data => resolve(data)))
});
})
// e would be of the format [data1, data2, .....]
Promises.all(accountsData).then(e => console.log(e))
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/537794.html
標籤:javascript网址
上一篇:Hibernate/Spring-org.hibernate.engine.internal.StatefulPersistenceContext記憶體使用過多
