如何解决解决数组或诺言并获得结果
我正在尝试映射和格式化数据以将其呈现到表中。我有一系列要通过Promise.all()解决的承诺。但它似乎没有返回诺言的结果。
我的代码如下:
const formatData = (data) => {
let dataCopy = data;
if (dataCopy.items && _.has(dataCopy.items[0],'tenantId')) {
dataCopy.items = setTenants(dataCopy)
}
// format parameters or table render
// other formatting for the table
return dataCopy.items.map(item => ({
...item,created: new Date(item.created).toDateString(),updated: new Date(item.updated).toDateString(),...(item.active && { active: item.active.toString() })
}));
};
const setTenants = (data) => {
const promises = data.items.map(item => {
return getTenant(item)
})
return Promise.all(promises).then(res => { return res })
}
const getTenant = (row) => {
return tenantService.getTenantById(row.tenantId).then(res => {
// set name as the tenant param for the table
row.tenant = res.name
return row
});
}
我的数据复制变量仅返回为:
[[PromiseState]]: "fulfilled"
[[PromiseResult]]: Array(10)
其中的结果是'setTenants'函数的正确结果。
解决方法
我尝试用
Promise.all()
解决一系列诺言。
Promise.all
不能解决承诺(或者在这种情况下,我认为您的意思是和解¹)。它使您可以观察兑现承诺的结果。这不会使解决。
您的setTenants
函数返回一个Promise。要使用其实现值,您必须使用.then
或await
(在async
函数中)。请记住,自setTenants
返回诺言以来,已开始的操作可能尚未完成。
所以
setTenants(/*...*/)
.then(results => {
// use results...
})
.catch(error => {
// handle/report error
});
或者,在async
函数中:
const results = await setTenants(/*...*/);
(也许用try
/ catch
来处理拒绝,尽管通常情况下,您只是希望将其传播给调用者并在那里进行处理。)
旁注:此代码中的then
回调是没有意义的:
return Promise.all(promises).then(res => { return res })
应该是:
return Promise.all(promises);
¹一些承诺术语:
- 完成-使用特定的实现值 将承诺状态从待处理更改为已实现 >
- 拒绝-通过特定的拒绝原因 将承诺状态从待处理更改为已拒绝 >
- 解决-直接(通过履行或拒绝)或通过确定间接(通过使结果取决于另一个承诺的结果)确定一个承诺的最终结果
重要的是要认识到,如果已解决的承诺已被解决另一个承诺,并且其他的承诺尚待解决。
这是一个例子:
const p1 = new Promise(resolve => {
setTimeout(resolve,800,42);
});
// This could also be written: `const p2 = Promise.resolve(p1);`
const p2 = new Promise(resolve => {
resolve(p1);
});
// At this point,both `p1` and `p2` are *pending*; `p2` is *resolved to*
// `p1`,but neither `p1` nor `p2` is *settled* yet
p2
.then(value => {
// At this point,`p2` is *fulfilled* (one of the two kinds of *settled*)
console.log(value);
})
.catch(error => {
// At this point,`p2` is *rejected* (one of the two kinds of *settled*)
console.error(error);
});
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。