Dalam beberapa kasus, ketika saya mendapatkan nilai hasil dari objek promise, saya perlu memulai dua then()
presesi berbeda bergantung pada kondisi nilai, seperti:
promise().then(function(value){
if(//true) {
// do something
} else {
// do something
}
})
Saya berpikir mungkin saya bisa menulisnya seperti:
promise().then(function(value){
if(//true) {
// call a new function which will return a new promise object
ifTruePromise().then();
} else {
ifFalsePromise().then();
}
})
tapi dengan ini, saya punya dua pertanyaan:
Saya tidak yakin apakah itu ide yang baik untuk memulai janji baru-kemudian memproses dalam janji;
bagaimana jika saya membutuhkan dua proses untuk memanggil satu fungsi pada akhirnya? Artinya mereka memiliki "terminal" yang sama
Saya mencoba mengembalikan janji baru untuk menjaga rantai asli seperti:
promise().then(function(value){
if(//true) {
// call a new function which will return a new promise object
// and return it
return ifTruePromise();
} else {
// do something, no new promise
// hope to stop the then chain
}
}).then(// I can handle the result of ifTruePromise here now);
tetapi dalam kasus ini, apakah itu benar atau salah, yang berikutnya then
akan berhasil.
JADI, apa praktik terbaik untuk mengatasinya?
node.js
asynchronous
promise
Brick Yang
sumber
sumber
Jawaban:
Selama fungsi Anda mengembalikan janji, Anda bisa menggunakan metode pertama yang Anda sarankan.
Biola di bawah ini menunjukkan bagaimana Anda dapat mengambil jalur perangkaian yang berbeda bergantung pada nilai yang pertama kali diselesaikan.
function myPromiseFunction() { //Change the resolved value to take a different path return Promise.resolve(true); } function conditionalChaining(value) { if (value) { //do something return doSomething().then(doSomethingMore).then(doEvenSomethingMore); } else { //do something else return doSomeOtherThing().then(doSomethingMore).then(doEvenSomethingMore); } } function doSomething() { console.log("Inside doSomething function"); return Promise.resolve("This message comes from doSomeThing function"); } function doSomeOtherThing() { console.log("Inside doSomeOtherthing function"); return Promise.resolve("This message comes from doSomeOtherThing function"); } function doSomethingMore(message) { console.log(message); return Promise.resolve("Leaving doSomethingMore"); } function doEvenSomethingMore(message) { console.log("Inside doEvenSomethingMore function"); return Promise.resolve(); } myPromiseFunction().then(conditionalChaining).then(function () { console.log("All done!"); }). catch (function (e) { });
Anda juga dapat membuat satu rangkaian bersyarat, menetapkan janji pengembalian ke variabel, dan kemudian terus menjalankan fungsi yang harus dijalankan dengan cara apa pun.
function conditionalChaining(value){ if (value) { //do something return doSomething(); } else{ //do something else return doSomeOtherThing(); } } var promise = myPromiseFunction().then(conditionalChaining); promise.then(function(value){ //keep executing functions that should be called either way });
sumber
Saya telah menulis paket sederhana untuk penggunaan janji bersyarat.
Jika Anda ingin memeriksanya:
halaman npm: https://www.npmjs.com/package/promise-tree
dan github: https://github.com/shizongli94/promise-tree
Menanggapi komentar yang menanyakan bagaimana paket memecahkan masalah:
1, Ini memiliki dua objek.
2, Objek cabang dalam paket ini adalah tempat penyimpanan sementara untuk fungsi-fungsi seperti onFulfilled dan onRejected yang ingin Anda gunakan di then () atau catch (). Ini memiliki metode seperti then () dan catch () yang mengambil argumen yang sama seperti rekan-rekan di Promise. Saat Anda meneruskan callback di Branch.then () atau Branch.catch (), gunakan sintaks yang sama seperti Promise.then () dan Promise.catch (). Kemudian jangan lakukan apa pun selain menyimpan callback dalam sebuah array.
3, Kondisi adalah objek JSON yang menyimpan kondisi dan informasi lain untuk pemeriksaan dan percabangan.
4, Anda menetapkan kondisi (ekspresi boolean) menggunakan objek kondisi di callback promise. Kondisi kemudian menyimpan informasi yang Anda berikan. Setelah semua informasi yang diperlukan disediakan oleh pengguna, objek kondisi menggunakan metode untuk membangun objek Promise yang benar-benar baru yang mengambil rantai janji dan informasi panggilan balik yang sebelumnya disimpan di objek Cabang. Bagian yang sedikit rumit di sini adalah Anda (sebagai pelaksana, bukan pengguna) harus menyelesaikan / menolak Janji yang Anda buat terlebih dahulu secara manual sebelum merangkai callback yang disimpan. Ini karena jika tidak, rantai janji baru tidak akan dimulai.
5, Berkat event loop, objek Branch dapat dibuat sebelum atau setelah Anda memiliki objek Promise batang dan objek tersebut tidak akan saling mengganggu. Saya menggunakan istilah "cabang" dan "batang" di sini karena strukturnya menyerupai pohon.
Kode contoh dapat ditemukan di halaman npm dan github.
Ngomong-ngomong, implementasi ini juga memungkinkan Anda memiliki cabang dalam satu cabang. Dan cabang tidak harus berada di tempat yang sama Anda memeriksa kondisi.
sumber
Beginilah cara saya melakukannya di fetch () saya, saya tidak yakin apakah ini cara yang benar, tetapi berhasil
fetch().then(res => res.ok ? res : false).then(res => { if (res) { //res ok } else { //res not ok } });
sumber