我使用此代码收到编译时错误:
const someFunction = async (myArray) => {
return myArray.map(myValue => {
return {
id: "my_id",
myValue: await service.getByValue(myValue);
}
});
};
错误信息是:
await是一个保留字
为什么我不能这样使用它?
我也尝试过另一种方式,但它给了我同样的错误:
const someFunction = async (myArray) => {
return myArray.map(myValue => {
const myNewValue = await service.getByValue(myValue);
return {
id: "my_id",
myValue: myNewValue
}
});
};
答案 0 :(得分:55)
您无法按照您的想象执行此操作,因为如果await
不直接位于async
函数内,则无法使用map
。
这里明智的做法是将函数传递给map
异步。这意味着Promise.all
将返回一组承诺。然后,我们可以使用Promise.all
在所有承诺返回时获得结果。当async
本身返回一个promise时,外部函数不需要是const someFunction = (myArray) => {
const promises = myArray.map(async (myValue) => {
return {
id: "my_id",
myValue: await service.getByValue(myValue)
}
});
return Promise.all(promises);
}
。
unsigned long b = 35000000;
unsigned long n = ( 100 * 30000000 ) / b;
答案 1 :(得分:8)
那是因为map
中的函数不是 async ,所以你不能在它的return语句中有等待。它编译了这个修改:
const someFunction = async (myArray) => {
return myArray.map(async (myValue) => { // <-- note the `async` on this line
return {
id: "my_id",
myValue: await service.getByValue(myValue)
}
});
};
所以...如果没有看到你的应用程序的其余部分就无法提供推荐,但是根据你想要做什么,要么使内部函数异步,要么尝试提出一些不同的这个街区的架构。
更新:我们可能会等待一天的最高级别:https://github.com/MylesBorins/proposal-top-level-await
答案 2 :(得分:1)
如果要使用异步映射功能运行地图,则可以使用以下代码:
select * from test_table_1 where col_1='value' and col_2='value';
select * from test_table_2 where col_1='value' and col_3='value';
select * from test_table_3 where col_1='value' and col_4='value';
工作方式:
const resultArray = await Promise.all(inputArray.map(async (i) => someAsyncFunction(i)));
返回一个promise数组-inputArray.map(async ...)
中的每个值一个。 inputArray
放在承诺数组的周围,将其转换为单个承诺。Promise.all()
的单个诺言返回一个值数组-单个诺言将每个解析为一个值。 Promise.all()
放在await
的前面,以便我们等待组合的承诺解决并将已解决的子承诺数组存储到变量Promise.all()
中。最后,对于resultArray
中的每一项,我们在resultArray
中获得了一个输出值,并通过函数inputArray
进行了映射。在结果可用之前,我们必须等待所有异步函数解析。
答案 3 :(得分:1)
这将是 2 个指令,但只需用额外的指令移动“等待”
let results = array.map((e) => fetch('....'))
results = await Promise.all(results)