Saya mengikuti spec di sini dan saya tidak yakin apakah itu memungkinkan onFulfilled untuk dipanggil dengan beberapa argumen.
Tidak, hanya parameter pertama yang akan diperlakukan sebagai nilai resolusi di konstruktor janji. Anda dapat menyelesaikan dengan nilai komposit seperti objek atau array.
Saya tidak peduli tentang bagaimana implementasi janji-janji spesifik melakukannya, saya ingin mengikuti spesifikasi w3c untuk janji-janji erat.
Di situlah saya yakin Anda salah. Spesifikasi ini dirancang agar minimal dan dibangun untuk beroperasi antara perpustakaan janji. Idenya adalah untuk memiliki subset yang masa depan DOM misalnya dapat andal digunakan dan perpustakaan dapat mengkonsumsi. Implementasi yang dijanjikan melakukan apa yang Anda minta .spread
untuk sementara waktu sekarang. Sebagai contoh:
Promise.try(function(){
return ["Hello","World","!"];
}).spread(function(a,b,c){
console.log(a,b+c); // "Hello World!";
});
Dengan Bluebird . Salah satu solusi jika Anda ingin fungsi ini adalah dengan polyfill.
if (!Promise.prototype.spread) {
Promise.prototype.spread = function (fn) {
return this.then(function (args) {
return Promise.all(args); // wait for all
}).then(function(args){
//this is always undefined in A+ complaint, but just in case
return fn.apply(this, args);
});
};
}
Ini memungkinkan Anda melakukan:
Promise.resolve(null).then(function(){
return ["Hello","World","!"];
}).spread(function(a,b,c){
console.log(a,b+c);
});
Dengan janji-janji asli tenang biola . Atau gunakan spread yang sekarang (2018) biasa di browser:
Promise.resolve(["Hello","World","!"]).then(([a,b,c]) => {
console.log(a,b+c);
});
Atau dengan menunggu:
let [a, b, c] = await Promise.resolve(['hello', 'world', '!']);