2017-02-27 60 views
10

我得到编译时错误使用此代码:异步/等待内部阵列#地图()

const someFunction = async (myArray) => { 
    return myArray.map(myValue => { 
     return { 
      id: "my_id", 
      myValue: await service.getByValue(myValue); 
     } 
    }); 
}; 

错误消息:

await is a reserved word

为什么我不能这样使用它?

我也试过另一种方式,但它给了我同样的错误:

const someFunction = async (myArray) => { 
    return myArray.map(myValue => { 
     const myNewValue = await service.getByValue(myValue); 
     return { 
      id: "my_id", 
      myValue: myNewValue 
     } 
    }); 
}; 
+1

我不认为你可以有异步箭头功能。 – Pointy

+0

相关https://github.com/tc39/ecmascript-asyncawait/issues/7 –

+1

从链接的github讨论中总结,你不能这样做,因为你作为回调传递的匿名函数不是'async'并且内部'await'不能影响外部功能。 –

回答

20

,你想象一下,你不能这样做,因为你不能使用await如果它不是直接的async函数中。

明智的做法是让这个函数传递给map异步。这意味着map将返回一组promise。然后,我们可以使用Promise.all获得所有承诺返回时的结果。由于Promise.all本身返回承诺,所以外部函数不需要为async

const someFunction = (myArray) => { 
    const promises = myArray.map(async (myValue) => { 
     return { 
      id: "my_id", 
      myValue: await service.getByValue(myValue) 
     } 
    }); 
    return Promise.all(promises); 
} 
+0

在这种情况下,promise中的数组并不会慢于数组中的经典值吗? – stackdave

+0

@stackdave可能是这样,但是这个差别在'service.getByValue'旁边可能是无关紧要的,这可能涉及网络调用...... – lonesomeday

+0

谢谢我已经开始使用它了,无论如何,可读性比速度要好,因为大多数ES6异步技术总是会变慢,但是谁在乎 – stackdave

4

我相信这是因为在map功能不异步,所以你不能有在它的等待返回语句。它编译这个修改:

const someFunction = async (myArray) => { 
    return myArray.map(async (myValue) => { // <-- note the `async` on this line 
     return { 
      id: "my_id", 
      myValue: await service.getByValue(myValue) 
     } 
    }); 
}; 

Try it out in Babel REPL

所以......这是不可能给的建议没有看到你的应用程序的其余部分,但是这取决于你想这样做,要么让功能异步或尝试为此块创建一些不同的体系结构。

更新:我们可能得到顶级等待第一天:https://github.com/MylesBorins/proposal-top-level-await

+0

谢谢,upvoted,但你的代码返回数组与空对象(即'[{},{}]')。我想我需要包含'await',但不知道在哪里 – MyTitle

+0

'service.getByValue'函数是什么样的? – helb

+0

它只是返回ES6 Promise – MyTitle