2016-03-25 40 views
0

以下代碼在最後一個處理程序中解析爲Promise {[[PromiseStatus]]: "pending", [[PromiseValue]]: undefined}Promise.all()方法未解析爲值

雖然在向控制檯發送承諾時錄製陣列時,每個都有狀態resolved,並且所有請求都得到滿足。

MusicService 
    .getArtists() 
    .then((res) => { 
    let arr = res.filter((a) => { 
     return a.id.length; 
    }); 
    return Promise.all(arr.map(function(a) { 
     return fetch(`//service.com/api/artist/${a.id}`); 
    })); 
    }) 
    .then((res) => { 
     console.log(res); 
    }); 

那麼,我錯過了什麼讓這個工作?

+1

如果你在任何'then's中有一個失敗回調會發生什麼?還是一個'catch'? – Neal

+1

@NielsSteenbeek承諾是如何工作的。在一個承諾中,你可以返回一個承諾,並將它鏈接在承諾鏈中。 – Neal

+0

「以下代碼在最後一次處理程序中解析爲'Promise {[[PromiseStatus]]:」pending「,[[PromiseValue]]:undefined}'。是的,你期望什麼? –

回答

1

FWIW,這可以簡化爲:

MusicService 
    .getArtists() 
    .then(res => Promise.all(
    res 
     .filter(a => a.id.length > 0) 
     .map(a => fetch(`//service.com/api/artist/${a.id}`)) 
    ) 
) 
    .then(res => { 
    console.log(res); 
    }); 

在過去的回調,res將是fetch()結果的陣列,它不可能是別的。

+0

是的,它必須是一個數組,但我仍然得到的是這條線,那個承諾正在等待。 –

+1

如果我用返回promise的樣機'getArtists()'和'fetch()'函數測試這個exaxt代碼,那麼我在回調中得到一個數組值。你是否超級地確信a)你有這個代碼(並且沒有細微的差別),b)你的fetch函數實際上是否返回值的承諾(而不是稍微不同)? – Tomalak

+0

我再次檢查了一切,我仍然無法弄清楚發生了什麼問題。無論如何,謝謝你的努力。 –