Menurut saya, inilah yang harus Anda lakukan.
memisahkan rantai
Karena kedua fungsi akan menggunakan amazingData , maka masuk akal untuk memilikinya dalam fungsi khusus. Saya biasanya melakukan itu setiap kali saya ingin menggunakan kembali beberapa data, jadi itu selalu ada sebagai fungsi arg.
Sebagai contoh Anda menjalankan beberapa kode, saya anggap semuanya dideklarasikan di dalam sebuah fungsi. Saya akan menyebutnya toto () . Kemudian kita akan memiliki fungsi lain yang akan menjalankan afterSomething () dan afterSomethingElse () .
function toto() {
return somethingAsync()
.then( tata );
}
Anda juga akan melihat saya menambahkan pernyataan pengembalian karena biasanya ini adalah cara untuk mengikuti Promises - Anda selalu mengembalikan janji sehingga kami dapat terus merangkai jika diperlukan. Di sini, sesuatuAsync () akan menghasilkan amazingData dan akan tersedia di mana saja di dalam fungsi baru.
Sekarang, seperti apa fungsi baru ini yang biasanya bergantung pada prosesAsync () juga asynchronous ?
processAsync tidak asynchronous
Tidak ada alasan untuk memperumit masalah jika processAsync () tidak asynchronous. Beberapa kode sekuensial lama yang bagus akan berhasil.
function tata( amazingData ) {
var processed = afterSomething( amazingData );
return afterSomethingElse( amazingData, processed );
}
function afterSomething( amazingData ) {
return processAsync( amazingData );
}
function afterSomethingElse( amazingData, processedData ) {
}
Perhatikan bahwa tidak masalah jika afterSomethingElse () melakukan sesuatu yang asinkron atau tidak. Jika ya, janji akan dikembalikan dan rantai dapat berlanjut. Jika tidak, maka nilai hasil akan dikembalikan. Tetapi karena fungsinya dipanggil dari a then () , nilainya akan tetap digabungkan menjadi janji (setidaknya dalam Javascript mentah).
processAsync asynchronous
Jika processAsync () asynchronous, kode akan terlihat sedikit berbeda. Di sini kami menganggap afterSomething () dan afterSomethingElse () tidak akan digunakan kembali di tempat lain.
function tata( amazingData ) {
return afterSomething()
.then( afterSomethingElse );
function afterSomething( ) {
return processAsync( amazingData );
}
function afterSomethingElse( processedData ) {
}
}
Sama seperti sebelumnya untuk afterSomethingElse () . Ini bisa asinkron atau tidak. Sebuah janji akan dikembalikan, atau nilai yang dibungkus menjadi janji yang diselesaikan.
Gaya pengkodean Anda cukup dekat dengan apa yang biasa saya lakukan, itulah mengapa saya menjawab bahkan setelah 2 tahun. Saya bukan penggemar berat fungsi anonim di mana-mana. Saya merasa sulit untuk membaca. Kalaupun hal itu cukup umum di masyarakat. Seperti kita mengganti neraka panggilan dengan api penyucian janji .
Saya juga suka membuat nama fungsi di kemudian pendek. Mereka hanya akan didefinisikan secara lokal. Dan sebagian besar waktu mereka akan memanggil fungsi lain yang ditentukan di tempat lain - sangat dapat digunakan kembali - untuk melakukan pekerjaan itu. Saya bahkan melakukan itu untuk fungsi dengan hanya 1 parameter, jadi saya tidak perlu memasukkan fungsi masuk dan keluar saat saya menambahkan / menghapus parameter ke tanda tangan fungsi.
Contoh makan
Berikut ini contohnya:
function goingThroughTheEatingProcess(plenty, of, args, to, match, real, life) {
return iAmAsync()
.then(chew)
.then(swallow);
function chew(result) {
return carefullyChewThis(plenty, of, args, "water", "piece of tooth", result);
}
function swallow(wine) {
return nowIsTimeToSwallow(match, real, life, wine);
}
}
function iAmAsync() {
return Promise.resolve("mooooore");
}
function carefullyChewThis(plenty, of, args, and, some, more) {
return true;
}
function nowIsTimeToSwallow(match, real, life, bobool) {
}
Jangan terlalu fokus pada Promise.resolve () . Ini hanyalah cara cepat untuk membuat janji yang sudah pasti. Apa yang saya mencoba untuk mencapai dengan ini adalah untuk memiliki semua kode saya berjalan di satu lokasi - hanya di bawah thens . Semua fungsi lainnya dengan nama yang lebih deskriptif dapat digunakan kembali.
Kelemahan dari teknik ini adalah teknik ini mendefinisikan banyak fungsi. Tapi itu rasa sakit yang perlu saya khawatirkan untuk menghindari fungsi anonim di mana-mana. Dan apa risikonya: tumpukan melimpah? (lelucon!)
Menggunakan array atau objek seperti yang didefinisikan dalam jawaban lain juga akan berfungsi. Yang satu ini adalah jawaban yang diajukan oleh Kevin Reid .
Anda juga dapat menggunakan bind () atau Promise.all () . Perhatikan bahwa mereka masih akan meminta Anda untuk membagi kode Anda.
menggunakan bind
Jika Anda ingin agar fungsi Anda dapat digunakan kembali tetapi tidak benar-benar perlu menyimpan apa yang ada di dalamnya dalam waktu yang sangat singkat, Anda dapat menggunakan bind () .
function tata( amazingData ) {
return afterSomething( amazingData )
.then( afterSomethingElse.bind(null, amazingData) );
}
function afterSomething( amazingData ) {
return processAsync( amazingData );
}
function afterSomethingElse( amazingData, processedData ) {
}
Sederhananya, bind () akan menambahkan daftar args (kecuali yang pertama) ke fungsi saat dipanggil.
menggunakan Promise.all
Di postingan Anda, Anda menyebutkan penggunaan spread () . Saya tidak pernah menggunakan kerangka kerja yang Anda gunakan, tetapi inilah cara Anda dapat menggunakannya.
Beberapa percaya Promise.all () adalah solusi untuk semua masalah, jadi saya rasa pantas untuk disebutkan.
function tata( amazingData ) {
return Promise.all( [ amazingData, afterSomething( amazingData ) ] )
.then( afterSomethingElse );
}
function afterSomething( amazingData ) {
return processAsync( amazingData );
}
function afterSomethingElse( args ) {
var amazingData = args[0];
var processedData = args[1];
}
Anda bisa meneruskan data ke Promise.all () - perhatikan keberadaan array - selama promise, tetapi pastikan tidak ada promise yang gagal jika tidak akan berhenti diproses.
Dan alih-alih menentukan variabel baru dari argumen args , Anda harus bisa menggunakan spread () daripada then () untuk semua jenis pekerjaan yang mengagumkan.