Saya mengikuti spec di sini dan saya tidak yakin apakah itu memungkinkan onFulfilled untuk dipanggil dengan beberapa argumen. Sebagai contoh:
promise = new Promise(function(onFulfilled, onRejected){
onFulfilled('arg1', 'arg2');
})
sedemikian rupa sehingga kode saya:
promise.then(function(arg1, arg2){
// ....
});
akan menerima keduanya arg1
dan arg2
?
Saya tidak peduli tentang bagaimana implementasi janji-janji spesifik melakukannya, saya ingin mengikuti spesifikasi w3c untuk janji-janji erat.
javascript
promise
badunk
sumber
sumber
Jawaban:
Tidak, hanya parameter pertama yang akan diperlakukan sebagai nilai resolusi di konstruktor janji. Anda dapat menyelesaikan dengan nilai komposit seperti objek atau array.
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:Dengan Bluebird . Salah satu solusi jika Anda ingin fungsi ini adalah dengan polyfill.
Ini memungkinkan Anda melakukan:
Dengan janji-janji asli tenang biola . Atau gunakan spread yang sekarang (2018) biasa di browser:
Atau dengan menunggu:
sumber
.spread
seperti Bluebird - alasannya tidak ada dalam spesifikasi adalah bahwa menjaga spesifikasi minimal benar-benar merupakan masalah besar untuk memungkinkan interop antara kode dan perpustakaan.Promise.all
array sebelum menerapkan fungsi daripada hanya.then
untuk menangani beberapa perpustakaan gula menyediakan. Itu tidak wajib, tapi itu lucu.return Promise.all(args).then(function(args){return fn.apply(this, args);})
spread
adalah pengganti sementara. ES6 memperkenalkan destrukturisasi dan operator sisanya / penyebaran, yang menghilangkan kebutuhan untukspread
langsung..then(([a, b, c]) => {})
Anda dapat menggunakan perusakan E6:
Destrukturisasi objek:
Perusakan susunan:
sumber
Nilai pemenuhan janji sejajar dengan nilai balik suatu fungsi dan alasan penolakan janji sejajar dengan pengecualian yang dilemparkan dari suatu fungsi. Fungsi tidak dapat mengembalikan beberapa nilai sehingga janji tidak boleh memiliki lebih dari 1 nilai pemenuhan.
sumber
Sejauh yang saya tahu membaca spesifikasi ES6 Promise dan spesifikasi janji standar, tidak ada klausul yang mencegah implementasi menangani kasus ini - namun tidak diterapkan di perpustakaan berikut:
Saya berasumsi alasan mereka menghilangkan penyelesaian multi-arg adalah untuk membuat urutan perubahan lebih ringkas (yaitu karena Anda hanya dapat mengembalikan satu nilai dalam suatu fungsi, itu akan membuat aliran kontrol menjadi kurang intuitif) Contoh:
sumber
return Promise.of(x, y)
bukannya nilai skalar darithen
callback.Berikut ini adalah solusi CoffeeScript.
Saya sedang mencari solusi yang sama dan menemukan seomething sangat menikung dari jawaban ini: Menolak janji dengan beberapa argumen (seperti $ http) di AngularJS
jawaban orang ini, Florian
Dan untuk menggunakannya:
sumber
->
menjadi=>
?Pertanyaan yang bagus, dan jawaban yang bagus dari Benjamin, Kris, et al - terima kasih banyak!
Saya menggunakan ini dalam sebuah proyek dan telah membuat modul berdasarkan kode Benjamin Gruenwald . Ini tersedia di npmjs:
Kemudian dalam kode Anda, lakukan
Jika Anda menggunakan perpustakaan seperti
any-promise
Mungkin orang lain menganggap ini berguna juga!
sumber
Mendefinisikan Penugasan dalam ES6 akan membantu di sini.
sumber
Karena fungsi dalam Javascript dapat dipanggil dengan sejumlah argumen, dan dokumen tidak menempatkan batasan apa pun pada
onFulfilled()
argumen metode selain klausa di bawah ini, saya pikir Anda bisa meneruskan beberapa argumen keonFulfilled()
metode selama nilai janji adalah argumen pertama.sumber
Mengutip artikel di bawah ini, "" lalu "membutuhkan dua argumen, panggilan balik untuk kasus sukses, dan lainnya untuk kasus kegagalan. Keduanya opsional, sehingga Anda dapat menambahkan panggilan balik hanya untuk kasus keberhasilan atau kegagalan."
Saya biasanya melihat halaman ini untuk pertanyaan janji dasar, beri tahu saya jika saya salah
http://www.html5rocks.com/en/tutorials/es6/promises/
sumber
new Promise
memiliki sintaksfunction(resolve, error)
sementarathen
memiliki sintaks.then(function(arg) {
.then(function(/*resolve args*/){/*resolve handler*/}, function(/*reject args*/){/*reject handler*/})