gpt4 book ai didi

javascript - 在对象数组的数组中运行 promise

转载 作者:行者123 更新时间:2023-12-04 07:27:24 25 4
gpt4 key购买 nike

我在一组对象数组中运行 Promise 时遇到问题。
我有一些数据的硬编码示例

const page = [
[
{
id: 1,
text: 'sentence 1'
},
{
id: 2,
text: 'sentence 2'
}
],
[
{
id: 3,
text: 'sentence 3'
}
]
]
一个名为 getSentiment 的函数接受一个字符串并返回一个 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)
}
}
这是我的代码,用于映射此嵌套数组,该数组为对象创建/添加新键/属性。
const resolvedPage = page
.map(line => line
.map(async sentence => {
sentence.sentiment = await getSentiment(sentence.text)
return sentence
}))
getSentiment使用 async/await 调用以获取值并分配给 sentiment属性,然后返回对象。
当我跑 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但我不知道该怎么做,因为我的数据嵌套在外部数组中。

最佳答案

您可以使用 Promise.all等待一系列 promise 完成。与 flatMap您可以首先将每一行映射到一组 promise ,然后将它们合并在一起(将其压平),因此它会产生一大堆 promise 。所以更新是在 map 内部完成的。 map 调用的返回 promise 仅用于等待 promise 完成。

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

关于javascript - 在对象数组的数组中运行 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68137380/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com