Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/413.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 异步/等待内部数组#map()_Javascript_Async Await_Ecmascript 2017 - Fatal编程技术网

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在异步函数中返回