2017-01-03 70 views
3
var arr = [1,2 ,3, 4, 5, 6, 67, 8, 10]; 

function f1() { 

    return arr.map(function (member) { 

     console.log(member); 
     return Promise.resolve(member + 2).then((result) => {return result + 2}).then 
     (value => {return value + 1}); 

    }); 



} 

console.log(f1()); 

輸出是每個索引處的Promise { <pending> }的數組。什麼是問題?我認爲return value + 1在最後解決了承諾,所以爲什麼我正在等待?獲取未決承諾數組

回答

0

您正在返回承諾的數組,所以你需要然後將它們,就像這樣:

f1().map(x => x.then(console.log)); 
0

它從你的代碼的預期。

你從.map返回一個數組,裏面你爲每個項目回報的承諾。

如果你想要得到的值,你可以返回Promise.all(your_array_promise)代替。

+0

'Promise.all'不「得值」。它產生的價值是一系列價值的承諾。 – 2017-01-03 13:48:08

3

有一個與代碼沒有問題,會發生什麼情況的預期。

我以爲return value + 1在最後解決的承諾

不,這不是return本身,它是then功能,將解決與回調函數的返回值的承諾。

不,它沒有解決諾言呢,它解決未來的承諾then回調總是被異步調用。

爲什麼我收到掛起?

因爲當你登錄他們仍然懸而未決;他們會在事後馬上得到解決。

如果你想將結果記錄的數組,使用

Promise.all(f1()).then(console.log); 
+0

非常容易混淆說'返回值+ 1'將「解決承諾」。這個特定的OP對承諾非常困惑,這是他的第四篇文章,基於同樣的問題,基於同樣的承諾誤解,特別是它是'then'處理器中的'return',它以某種方式解決了承諾。我認爲在這一點上我們不能達成目標,但要儘可能清楚地表明,「回報」並不能解決承諾,而是提供解決問題的價值。 – 2017-01-03 13:47:24

+0

@torazaburo感謝您提醒我這個問題,我已經修復了sl termin的術語。但是我重複投票不同意,我覺得這個特別的問題是關於爲什麼他仍然得到'無極{}',而不是在控制檯中履行諾言。 – Bergi

+0

感謝您解決這個問題。據我所知,OP的混亂根源在於「解決」的含義(在他最初的問題中,他實際上問了「解決」的含義)。他似乎相信解決一個承諾以某種方式將它轉化爲一個純粹的價值,所以'Promise.resolve(42).then(x => x)'會記錄'42'。這就是爲什麼他感到困惑,他最終得到了一系列的承諾,而不是一系列的價值觀,因爲在他的腦海中,他期待'then'處理程序中的'return'將神奇地將承諾變成純粹的價值。 – 2017-01-03 14:11:43