为了账号安全,请及时绑定邮箱和手机立即绑定

解决数组或承诺并获得结果

解决数组或承诺并获得结果

30秒到达战场 2023-04-20 17:07:43
我正在尝试映射和格式化数据以将其呈现到表格中。我尝试使用 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”函数的正确结果。
查看完整描述

1 回答

?
白衣非少年

TA贡献1155条经验 获得超0个赞

我有一系列的承诺,我正试图用Promise.all().


Promise.all不解决承诺(或者我认为你的意思是在这种情况下解决¹)。它允许您观察promises 被结算的结果。这不会让他们安定下来。


您的setTenants函数返回一个承诺。要使用其实现值,您必须使用.then或await(在async函数中)。请记住,截至 whensetTenants返回其承诺,已启动的操作可能尚未完成。


所以


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);

¹ 一些承诺术语:

  • fulfill - 将 promise 状态从pending更改为fulfilled并具有特定的fulfillment 值

  • reject - 将 promise 状态从pending更改为rejected并给出特定的拒绝原因

  • resolve - 直接(通过履行或拒绝)或间接(通过使其结果取决于另一个承诺的结果)来确定承诺的最终结果

重要的是要认识到,如果一个已解决的承诺已解决为另一个承诺并且另一个承诺处于待定状态,则该承诺仍将处于待定状态。

这是一个例子:

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);

});


查看完整回答
反对 回复 2023-04-20
  • 1 回答
  • 0 关注
  • 98 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信