Saya menggunakan bluebird dan saya melihat dua cara untuk menyelesaikan fungsi sinkron menjadi Promise, tetapi saya tidak mendapatkan perbedaan di antara kedua cara tersebut. Sepertinya stacktrace sedikit berbeda, jadi mereka bukan hanya sekedar alias
, bukan?
Jadi cara apa yang disukai?
Cara A
function someFunction(someObject) {
return new Promise(function(resolve) {
someObject.resolved = true;
resolve(someObject);
});
}
Cara B
function someFunction(someObject) {
someObject.resolved = true;
return Promise.resolve(someObject);
}
javascript
promise
bluebird
Pipo
sumber
sumber
Promise.resolve
hanyalah gula.Jawaban:
Bertentangan dengan kedua jawaban di komentar - ada perbedaan.
Sementara
Promise.resolve(x);
pada dasarnya sama dengan
new Promise(function(r){ r(x); });
ada kehalusan.
Fungsi pengembalian janji umumnya harus memiliki jaminan bahwa fungsi tersebut tidak boleh ditampilkan secara sinkron karena mungkin ditampilkan secara asinkron. Untuk mencegah hasil yang tidak diharapkan dan kondisi balapan - lemparan biasanya diubah menjadi penolakan yang dikembalikan.
Dengan mengingat hal ini - saat spesifikasi dibuat, konstruktor promise akan aman.
Bagaimana jika
someObject
yangundefined
?Bluebird melihat ini, dan Petka menambahkan
Promise.method
untuk mengatasi masalah ini sehingga Anda dapat terus menggunakan nilai pengembalian. Jadi cara yang benar dan termudah untuk menulis ini di Bluebird sebenarnya tidak keduanya - yaitu:var someFunction = Promise.method(function someFunction(someObject){ someObject.resolved = true; return someObject; });
Promise.method akan mengubah lemparan menjadi penolakan dan pengembalian menjadi penyelesaian untuk Anda. Ini adalah cara yang paling aman untuk melakukan ini dan itu mengasimilasi kemampuan
then
melalui nilai-nilai kembali sehingga itu akan bekerja bahkan jikasomeObject
sebenarnya adalah janji itu sendiri.Secara umum,
Promise.resolve
digunakan untuk mentransmisikan objek dan janji asing (kemudian) menjadi janji. Itu kasus penggunaannya.sumber
Promise.resolve()
adalah anti-pola?Promise.resolve()
membuat contoh baruPromise
dengan cara yang sama seperti menggunakannew
? Jika tidak,return Promise.resolve(yourCode)
akan lebih cepat dan menghindari lemparan sinkron.Promise.coroutine
yang lebih berguna.Ada perbedaan lain yang tidak disebutkan oleh jawaban atau komentar di atas:
Jika
someObject
aPromise
,new Promise(resolve)
akan dikenakan biaya dua centang tambahan.Bandingkan dua cuplikan kode berikut:
const p = new Promise(resovle => setTimeout(resovle)); new Promise(resolve => resolve(p)).then(() => { console.log("tick 3"); }); p.then(() => { console.log("tick 1"); }).then(() => { console.log("tick 2"); });
const p = new Promise(resovle => setTimeout(resovle)); Promise.resolve(p).then(() => { console.log("tick 3"); }); p.then(() => { console.log("tick 1"); }).then(() => { console.log("tick 2"); });
Potongan kedua akan mencetak 'centang 3' terlebih dahulu. Mengapa?
Jika nilainya adalah promise,
Promise.resolve(value)
akan mengembalikan nilai dengan tepat.Promise.resolve(value) === value
akan benar. lihat MDNTapi
new Promise(resolve => resolve(value))
akan mengembalikan janji baru yang terkunci untuk mengikutivalue
janji itu. Perlu satu centang ekstra untuk membuat 'penguncian'.// something like: addToMicroTaskQueue(() => { p.then(() => { /* resolve newly promise */ }) // all subsequent .then on newly promise go on from here .then(() => { console.log("tick 3"); }); });
Telepon itu
tick 1
.then
akan dijalankan lebih dulu.Referensi:
sumber