Javascript 异步/等待内部数组#map()
以下代码出现编译时错误:Javascript 异步/等待内部数组#map(),javascript,async-await,ecmascript-2017,Javascript,Async Await,Ecmascript 2017,以下代码出现编译时错误: const someFunction = async (myArray) => { return myArray.map(myValue => { return { id: "my_id", myValue: await service.getByValue(myValue); } }); }; 错误消息是: 等待是一个保留字 为什么我不能这样使用它 我还尝试了
const someFunction = async (myArray) => {
return myArray.map(myValue => {
return {
id: "my_id",
myValue: await service.getByValue(myValue);
}
});
};
错误消息是:
等待是一个保留字
为什么我不能这样使用它
我还尝试了另一种方法,但它给了我同样的错误:
const someFunction = async (myArray) => {
return myArray.map(myValue => {
const myNewValue = await service.getByValue(myValue);
return {
id: "my_id",
myValue: myNewValue
}
});
};
这是因为
map
中的函数不是异步的,所以不能在它的返回语句中包含wait。它通过以下修改进行编译:
const someFunction = async (myArray) => {
return myArray.map(async (myValue) => { // <-- note the `async` on this line
return {
id: "my_id",
myValue: await service.getByValue(myValue)
}
});
};
const someFunction=async(myArray)=>{
返回myArray.map(async(myValue)=>{/您不能像您想象的那样执行此操作,因为如果它不是直接在异步
函数中,您就不能使用等待
这里明智的做法是使传递给map
的函数异步。这意味着map
将返回一个承诺数组。然后我们可以使用Promise.all
在所有承诺返回时得到结果。正如Promise。all
本身返回一个承诺,外部函数不需要o应异步
const someFunction = (myArray) => {
const promises = myArray.map(async (myValue) => {
return {
id: "my_id",
myValue: await service.getByValue(myValue)
}
});
return Promise.all(promises);
}
如果要使用异步映射函数运行映射,可以使用以下代码:
const resultArray = await Promise.all(inputArray.map(async (i) => someAsyncFunction(i)));
工作原理:
inputArray.map(async…
返回一个承诺数组-一个承诺对应于inputArray
中的每个值
- 在承诺数组周围放置
Promise.all()
,将其转换为单个承诺
promise.all()
中的单个promise返回一个值数组-单个promise将每个值解析为一个值
- 我们将
wait
放在Promise.all()
前面,以便等待组合承诺解析并将解析的子承诺数组存储到变量resultArray
中
最后,我们在resultArray
中为inputArray
中的每个项目获得一个输出值,通过函数someAsyncFunction
映射。我们必须等待所有异步函数解析后,结果才可用。我认为您不能使用异步箭头函数。与从链接的github汇总相关讨论中,您不能这样做,因为您作为回调传递的匿名函数不是async
,内部的await
不能影响外部函数。async/await
是ES2017(今年的版本)的一部分,不是ES7(去年的版本)。谢谢,升级了,但是您的代码返回了空对象数组(即[{},{}]
)。我想我需要在某个地方包含await
,但我不知道服务。getByValue
函数是什么样子的?它只返回ES6 Promise。在我看来,OP期望一个id对象数组作为最终结果,因此我想你可能希望返回await Promise。好的(myArray.map
…用于等效性。在这种情况下,承诺数组的速度不会比let-in数组的经典速度慢?@stackdave可能,但与服务相比,差异将是无关紧要的。getByValue
,这很可能涉及网络调用…感谢我已经开始使用它,无论如何可读性比velocity好,因为大多数ES6异步技术总是比较慢,但是谁呢care@lonesomeday这能处理调用之间的错误或限制/延迟吗?@KylePennell是的。在从外部函数返回之前,您需要使用异步函数中的try..catch
或catch
处理程序来处理错误。之前可以引入限制e在异步函数中返回。