Callback yang ada di mana -mana di JavaScript adalah bencana untuk kontrol proses, dan kelemahannya jelas:
1. Tanpa pengembalian eksplisit, mudah untuk menghasilkan proses dan bug yang tidak perlu yang disebabkan oleh mereka.
2. Kode ini bersarang tanpa batas dan sulit dibaca.
Mari kita bicara tentang cara menyelesaikan dan menghindari masalah di atas.
Masalah pertama adalah masalah kebiasaan. Saat menggunakan callback, orang sering lupa menggunakan kembali. Situasi ini terutama benar saat menggunakan skrip kopi (meskipun mengumpulkan data terakhir sebagai nilai pengembalian ketika dikompilasi ke dalam JavaScript, nilai pengembalian ini tidak selalu mewakili niat asli Anda). Lihatlah contoh di bawah ini.
Salinan kode adalah sebagai berikut:
a = (err, callback)->
callback () jika err?
console.log 'Anda akan melihat saya'
b = ->
console.log 'Saya panggilan balik'
a ('error', b)
Dalam gaya kode "kesalahan pertama" ini, jelas kami tidak ingin kode selanjutnya dalam metode A untuk dieksekusi ketika kesalahan terjadi, tetapi kami tidak ingin menggunakan lemparan untuk membuat seluruh proses menggantung (Anda harus mati dengan anggun ~), sehingga kode di atas akan menyebabkan bug.
Salah satu solusi adalah dengan jujur menulis jika ... lain ..., tapi saya lebih suka yang berikut:
Salinan kode adalah sebagai berikut:
a = (err, callback)->
mengembalikan callback () jika err?
Console.log 'Anda tidak akan melihat saya'
b = ->
console.log 'Saya panggilan balik'
a ('error', b)
Sebagian besar nilai pengembalian dalam metode asinkron JavaScript tidak berguna, jadi di sini kita menggunakan pengembalian sebagai peran kontrol proses, dengan kode lebih sedikit daripada jika ... lain ... tapi lebih jelas.
Masalah kedua adalah sulit untuk diberantas.
Cara yang baik adalah dengan menggunakan beberapa modul kontrol proses untuk membuat kode tampak lebih terorganisir. Misalnya, async adalah modul yang baik yang menyediakan serangkaian antarmuka, termasuk iterasi, loop, dan beberapa pernyataan bersyarat, dan bahkan sistem antrian. Contoh -contoh berikut dapat digunakan untuk menggambarkan kelebihan dan kekurangan dari dua cara menulis nama.
Salinan kode adalah sebagai berikut:
#normal
pertama = (callback)->
Console.log 'Saya adalah fungsi pertama'
callback ()
kedua = (callback)->
Console.log 'Saya adalah fungsi kedua'
callback ()
ketiga = ()->
Console.log 'Saya adalah fungsi ketiga'
pertama ->
kedua ->
ketiga()
# Gunakan async
async = membutuhkan ('async')
async.waterfall [
Pertama,
Kedua,
ketiga
], (err)->
Sebagai orang yang bijak, mana yang akan Anda pilih?