2017-09-04 29 views
2

內部異步函數的一個承諾考慮這個簡化的代碼鏈接到它

;(async() => { 
    const a = [1, 2] 
    const p = a.map(async (v, i) => { 
    if (i === 0) { 
     return await 1 
    } 
    return await p[i - 1] 
    }) 
    console.log(await Promise.all(p)) 
})() 

在V8(鉻/的NodeJS)它稻一個錯誤「的ReferenceError:對沒有定義」

在Firefox它只是什麼都不給

問題:這是什麼問題呢?

+0

請告訴我這個代碼的意義嗎? –

+0

如果你可以(也)發佈你的實際代碼,而不僅僅是這個簡化代碼,它可能會有所幫助。 – Bergi

回答

4

我很確定你的意思是a[i-1]。當執行map回調時,p變量爲not yet initialised。由於反向編譯問題,Firefox可能尚未實現暫時死區。

您的代碼可能(應該)工作時,你訪問p異步,即是具有await版別的東西后:

const p = a.map(async (v, i) => { 
    if (i === 0) { 
    return await 1 
    } 
    await; // delay until `p` is available 
    return await p[i - 1] 
}) 

不過,我會認爲這是可怕的,混亂的代碼。如果你想要做的事相繼在異步功能,使用標準的循環:

for (const v of a) 
    await 1; 

,如果你想在並行運行某些任務,使用Promise.all但要確保它們不依賴於對方。

+0

這是一個簡化的例子,所以實際上等待在線以前是我需要的。謝謝 – Agat

0
return await p[i - 1] 

p使用.map函數內,當它被稱爲是不可用的。

你大概的意思是:

return await a[i - 1]