运行 在对象数组的数组中承诺
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)
})();
我在对象数组的数组中 运行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)
})();