Sebagai contoh, saya mempunyai A.func1() yang tidak segerak dan ia boleh mengembalikan objek x1 Saya juga mempunyai B.func2() yang juga tidak segerak dan perlu dilaksanakan berdasarkan x1, dan kemudian B. .func2 mengembalikan nilai akhir t, dan beberapa paparan segera akan dilakukan berdasarkan nilai akhir ini. Bagaimana saya harus menulis ini?
Kod yang saya tulis sendiri adalah seperti ini
A.func1().
then(function(x1) {
B.func2(x1).
then(function(t) {
//do something
})
})
Tapi rasanya sama je kesannya sama ada guna dulu atau tidak...masih bertukar kembali menjadi piramid
Sebagai tindak balas kepada komen tambahan dalam ulasan tentang "keadaan menyelamatkan semasa panggilan berterusan", saya ingin menghuraikan beberapa strategi
Strategi terbaik: Nyahpenyataan
Iaitu, laraskan logik anda supaya proses panggilan A.func1, B.func2, dan fungsi tanpa nama (sebut saja func3) tidak mengandungi keadaan, iaitu, biarkan func3 hanya bergantung pada output func2 , bukan output func1; atau biarkan func2 tidak bergantung pada func1, gunakan sesuatu seperti
Promise.all
untuk mendapatkan hasil func1 dan func2 pada masa yang sama dan buangnya ke func3Strategi pusat: status penyelenggaraan berubah "global"
Kelebihan: negeri boleh dipanjangkan kepada keadaan.x2 .x3...
Kaedah bindMasalah: Jika rantaian panggilan yang panjang mempunyai keadaan yang kompleks, ia adalah mudah untuk mencemari pepijat, dan kebolehselenggaraan kod akan dikurangkan dengan serius
bluebird
boleh mengikat Arg ini dan boleh digunakan untuk mengekalkan keadaan Prinsipnya adalah samaStrategi pertengahan: penghantaran tambahan sementara
Kelebihan: Tanpa keadaan, jika rantai panggilan panjang, keadaan tambahan ini dikawal antara dua langkah, mengekalkan kebolehselenggaraan yang lebih baik dan kurang terdedah kepada pepijat
Kelemahan: Jika setiap langkah rantai panggilan panjang mempunyai keadaan, ia akan menjadi sangat bertele-tele
Sudah tentu, dalaman kemudian di sini juga boleh dikapsulkan dan dioptimumkan sendiri
Penyelesaian terakhir: Keadaan penyelenggaraan penutupan
Malah, ia adalah cara asal menulis soalan, saya rasa masalah utamanya ialah soalan itu telah diturunkan kembali kepada "neraka panggilan balik" yang asal atau memalukan piramid panggilan balik
Kelebihannya...berkesan
Mengembalikan objek
then
terus di dalamPromise
, seperti berikut:Sebagai tindak balas kepada masalah yang dinyatakan dalam ulasan anda, jika anda tidak menggunakan pustaka
Promise
pihak ketiga, anda boleh menggunakannya seperti berikut:Menggunakan pustaka
Promise
pihak ketiga boleh memudahkan proses ini.Promise akan mengembalikan objek janji, supaya ia boleh menggunakan panggilan berantai yang elegan.
Jika nilai pulangan fungsi pada masa itu ialah kuantiti langsung, ia akan digunakan sebagai parameter panggilan berantai seterusnya
Jika nilai pulangan mempunyai antara muka janji, hasil keputusan janji dikembalikan
Gunakan q sebagai contoh