我想多次调用我的api,然后只返回出错的对象(这里是worker)
你对这个实现有什么看法?(我不喜欢.then(()=> false,但即使使用reduce,我也没有想出更好的实现)
我希望避免在Promise.all之后进行筛选
谢谢
updateWorkersStatusOnMissions: (workersOnMissions, apiService) => {
const updateWorkerStatusOnMissionPromises = workersOnMissions
.map(workerOnMission =>
apiService.put('missions', formatWorkerOnMission(workerOnMission))
.then(() => false)
.catch(() => formatWorkerInError(workerOnMission))
)
return Promise
.all(updateWorkerStatusOnMissionPromises)
.then(filter(Boolean))
},发布于 2018-08-28 21:10:42
我通常做的是在结果周围引入某种“盒子”,它可以告诉我从承诺中获得的“种类”结果。promise总是会向您返回值,但根据提供then(onSuccess, onFail)的位置不同,返回值的类型会有所不同。
const into = type => val => ({ type, val })
const arrayOfstuff = [];
const arrayOfPromises = arrayOfstuff.map(stuff => makePromise(stuff)
.then(into("success"), into("error")))
const successFullStruff = Promise.all(arrayOfPromises)
.then(filter(result => result.type === "success"))
const failedStuff = Promise.all(arrayOfPromises)
.then(filter(result => result.type === "error"))发布于 2018-08-28 21:22:10
如果您希望根据谓词对列表/数组进行分区(在本例中,是承诺已解决还是已拒绝),请使用partition!
const partitionP = coll => {
const resolved = [];
const rejected = [];
return Promise.all(coll.map(p => {
p.then(result => resolved.push(result)).catch(err => rejected.push(err));
}).then(_ => [resolved, rejected]);
});
async getApiResults = workersOnMissions => {
const [results, errors] = await partitionP(workersOnMissions.map(workerOnMission => {
return apiService.put('missions', formatWorkerOnMission(workerOnMission));
}));
// do something with the results/errors or just return them
};在这里,您确实需要一个Promise感知分区,因为如果数组中的任何Promise拒绝,Promise.all将立即拒绝,这意味着您需要手动管理迭代(在本例中,通过确保.catch所有拒绝并将它们放回快乐路径)。否则,您可以做一些更简单的事情,比如映射api调用以获得Promises数组,然后在.then处理程序中对结果进行分区。
https://stackoverflow.com/questions/52058529
复制相似问题