运行 在对象数组的数组中承诺

Run promises in an array of an array of objects

我在对象数组的数组中 运行ning Promise 遇到问题。

我有一些数据的硬编码示例

const page = [
    [
      {
        id: 1,
        text: 'sentence 1'
      },
      {
        id: 2,
        text: 'sentence 2'
      }
    ],
    [
      {
        id: 3,
        text: 'sentence 3'
      }
    ]
  ]

一个名为 getSentiment 的函数接受一个字符串并且 return 是一个 promise

function getSentiment (sentence) {
  const rand = Math.random()
  if (rand < 0.3) { 
    return Promise.resolve(-1) 
  } else if (rand < 0.6) { 
    return Promise.resolve(0) 
  } else { 
    return Promise.resolve(1)
 }
}

这是我的代码,它将这个嵌套数组 creates/adds 新 key/property 映射到对象。

const resolvedPage = page
    .map(line => line
      .map(async sentence => {
        sentence.sentiment = await getSentiment(sentence.text)
        return sentence
      }))
使用 async/await 调用

getSentiment 以获取值并分配给 sentiment 属性 然后 return 对象。

当我 运行 console.log(resolvedPage) 我得到这个

[
  [ Promise { <pending> }, Promise { <pending> } ],
  [ Promise { <pending> } ]
]

我期望的结果应该是这样的:

[
[
  {
    id: 1,
    text: 'sentence 1',
    sentiment: 0
  },
  {
    id: 2,
    text: 'sentence 2',
    sentiment: -1
  }
],
[
  {
    id: 3,
    text: 'sentence 3',
    sentiment: 1
  }
]

]

我尝试使用 Promise.all,但我不确定该怎么做,因为我的数据嵌套在外部数组中。

有话要说


export async function myFunc (list) {
    for (const items of list) {
        
        for (const item of items){
             const result = await (your promise);
             //// rest of code
        }

   }

}

您可能需要添加正确的@babel/plugins才能使用它

您可以使用 Promise.all 来等待一组承诺完成。使用 flatMap 你可以首先将每一行映射到一个 promise 数组,然后将它们合并在一起(展平),因此它会产生一个大的 promise 数组。所以更新是在地图内部完成的。 return 地图调用的承诺仅用于等待承诺完成。

const page = [
    [{ id: 1, text: 'sentence 1' },
     { id: 2, text: 'sentence 2' }
    ],
    [{ id: 3, text: 'sentence 3' }]
  ]

function getSentiment (sentence) {
  const rand = Math.random()
  if (rand < 0.3) { 
    return Promise.resolve(-1) 
  } else if (rand < 0.6) { 
    return Promise.resolve(0) 
  } else { 
    return Promise.resolve(1)
 }
}

const main = async () => {
  const promises = page
    .flatMap(line => line.map(async sentence => {
      sentence.sentiment = await getSentiment(sentence.text)
    }))
  await Promise.all(promises)
  console.log(page)
}
main()

您可以将异步代码包装在函数中并使用 Promise.all 例如

(async () => {
  const resolvedPage = await Promise.all(
    page.map(
      async line => await Promise.all(
        line.map(
          async sentence => ({ ...sentence, sentiment: await getSentiment(sentence.text) })
        )
      )
    )
  );
  
  console.log(resolvedPage)
})();