2017-02-27 101 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