2016-07-12 30 views
-1

我正在玩諾言,發現約Promise.all()如果我理解正確,它會解決所有參數承諾後解決。我試了一下代碼Promise all resolvation

var x = ["one", "two"]; 
var g = 1000; 

function take(element, sec) { 
    return new Promise(function(res, rej) { 
    setTimeout(function() { 
     res(element) 
    }, sec); 
    }) 
} 

Promise.all(x.map(y => { 
    take(y, g); 
    g+=1000; 
})).then(f => { 
    alert('done : ' + f); 
}) 

但是它Promise.all即刻解決了,這個小代碼有什麼bug還是我對它的理解不好?

+4

'map'需要返回'take'的值。就目前而言,您正在詢問'Promise.all'來解析未定義的列表。 –

回答

1

由於torazaburo已經注意到map回調中的return聲明丟失。帶塊語法的箭頭函數需要明確的return。現在,以下分配g+=1000被忽略。無論如何,依靠全球化的狀態並不是好習慣。所以我的表達轉移到map回調,並使用箭頭,而不塊語法:

var x = ["one", "two"]; 

function take(element, sec) { 
    return new Promise(function(res, rej) { 
    setTimeout(function() { 
     res(element) 
    }, sec); 
    }) 
} 

Promise.all(x.map((y, i) => take(y, 1000*(i+1)))).then(f => alert('done : ' + f)); 
+0

*「與正常箭頭相反,胖箭頭函數需要顯式的'return'」* - 嗯?沒有「正常」或「胖」箭頭功能。 – naomik

+0

@naomik好的,編輯它。我仍然認爲我的術語是合適的。帶有塊語法的箭頭非常胖,因爲他吞下了如此多的陳述:D – ftor

+0

我相信術語「胖箭頭函數」來自咖啡腳本,其中既有「瘦箭頭函數」 - >'和他們的「胖」對應' =>'。不同之處在於' - >'沒有詞法'這個',而''=>'確實。 – naomik

0

正如前面已經說過的多個地方,你需要從.map()回調順序返回承諾爲Promise.all()工作。這裏有一個簡單的方法來做到這一點:

Promise.all(x.map(y => { 
    var p = take(y, g); 
    g+=1000; 
    return p; 
})).then(f => { 
    alert('done : ' + f); 
}); 

在這段代碼f是結果的數組,因此目前還不清楚你想在alert()做什麼。