Saya ingin melepaskan beberapa koleksi mongodb, tetapi itu adalah tugas yang tidak sinkron. Kode tersebut adalah:
var mongoose = require('mongoose');
mongoose.connect('mongo://localhost/xxx');
var conn = mongoose.connection;
['aaa','bbb','ccc'].forEach(function(name){
conn.collection(name).drop(function(err) {
console.log('dropped');
});
});
console.log('all dropped');
Konsol menampilkan:
all dropped
dropped
dropped
dropped
Bagaimana cara termudah untuk memastikan all dropped
akan dicetak setelah semua koleksi sudah jatuh? Pihak ketiga mana pun dapat digunakan untuk menyederhanakan kode.
javascript
node.js
asynchronous
mongoose
synchronous
Freewind
sumber
sumber
forEach
adalah sinkron. Lihat di sini: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… Ada implementasiforEach
di bagian bawah. Tidak semuanya dengan callback asynchronous.Gunakan Janji .
Ini menjatuhkan setiap koleksi, mencetak "jatuh" setelah masing-masing, dan kemudian mencetak "semua jatuh" setelah selesai. Jika terjadi kesalahan, itu akan ditampilkan ke
stderr
.Jawaban sebelumnya (ini mendahului dukungan asli Node untuk Promises):
Gunakan janji Q atau janji Bluebird .
Dengan Q :
Dengan Bluebird :
sumber
require('bluebird')
.promisifyAll
fitur tersebut.function abc(data){
, karena tidak sepertifunction abc(err, callback){...
Pada dasarnya saya tidak berpikir semua fungsi mengambil kesalahan sebagai param pertama dan callback sebagai param kedua.map(function(name) { return conn.collection(name).drop() })
Cara untuk melakukannya adalah dengan meneruskan tugas panggilan balik yang memperbarui penghitung bersama. Ketika penghitung bersama mencapai nol, Anda tahu bahwa semua tugas telah selesai sehingga Anda dapat melanjutkan aliran normal Anda.
Tentu saja, ada banyak cara untuk membuat kode semacam ini lebih umum atau dapat digunakan kembali dan salah satu dari banyak pustaka pemrograman asinkron di luar sana harus memiliki setidaknya satu fungsi untuk melakukan hal semacam ini.
sumber
Memperluas jawaban @freakish, async juga menawarkan metode masing-masing, yang tampaknya sangat cocok untuk kasus Anda:
IMHO, ini membuat kode lebih efisien dan lebih terbaca. Saya telah mengambil kebebasan untuk menghapus
console.log('dropped')
- jika Anda menginginkannya, gunakan ini sebagai gantinya:sumber
Saya melakukan ini tanpa perpustakaan eksternal:
sumber
Semua jawaban sudah cukup lama. Sejak awal 2013 Mongoose mulai mendukung promise secara bertahap untuk semua kueri, jadi itu akan menjadi cara yang direkomendasikan untuk menyusun beberapa panggilan asinkron dalam urutan yang diperlukan di masa mendatang.
sumber
Dengan
deferred
(implementasi promise / deferred lain), Anda dapat melakukan:sumber
Jika Anda menggunakan Babel atau transpiler semacam itu dan menggunakan async / await, Anda dapat melakukan:
sumber
drop()
dan berharap untuk mengembalikan Janji. Bisakah Anda memperbaiki contoh ini dan menghapusonDrop
?