2016-09-27 26 views
2

我試圖跟隨MDN promise.all示例,但它似乎我不能傳遞更多的參數setTimeout callback傳遞多個參數以承諾解決setTimeout內

var p1 = new Promise((resolve, reject) => { 
    setTimeout(resolve, 200, 1,2,3); 
}); 
var p2 = new Promise((resolve, reject) => { 
    setTimeout(resolve, 500, "two"); 
}); 

Promise.all([p1, p2]).then(value => { 
    console.log(value); 
}, reason => { 
    console.log(reason) 
}); 

這將打印[1, "two"],在那裏我會想到[1, 2, 3, "two"]。如預期

setTimeout(cb, 100, 1, 2, 3); 
function cb(a, b, c){ 
    console.log(a, b, c); 
} 
//=>1 2 3 

setTimeout不還願的作品這樣做爲什麼不承諾此項工作?如何才能與諾言一起工作?

回答

3

resolve函數只接受一個參數。你無法改變,因爲這是規範。

通過超過這一點並沒有什麼不同,並且您的其他值將被忽略。

您可以選擇將數組傳遞給resolve函數,但是您將在處理函數then上得到一個數組,而不是像您想要的那樣的獨立值。

3

resolve()只接受和處理一個參數,履行的承諾只有一個值。這是根據承諾規範,並不是你可以改變的。

如果您想傳遞多個信息,那麼您可以將多個數據片段包裝到數組或對象中,並將該對象用作解析值,然後更改接收代碼以在包裝對象:

var p1 = new Promise((resolve, reject) => { 
    // put multiple resolved values into an array 
    setTimeout(resolve, 200, [1,2,3]), 200); 
}); 
var p2 = new Promise((resolve, reject) => { 
    setTimeout(resolve, 500, "two"); 
}); 

Promise.all([p1, p2]).then(value => { 
    console.log(value); // [[1,2,3], "two"] 
}, reason => { 
    console.log(reason) 
}); 

如果你真的想最終.then()處理器沒有嵌入式陣列內indpendent值,那麼您可以在處理結果之前壓平在.then()處理程序value陣列。這裏有許多技巧用於平坦化數組:Merge/flatten an array of arrays in JavaScript?

+1

如果知道'Promise'的數量,則可以將解構賦值傳給'then'處理函數:'.then(([first,second])=> '。 – ftor