Bazı mongodb koleksiyonlarını bırakmak istiyorum, ancak bu asenkron bir görev. Kod şöyle olacak:
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 görüntülenir:
all dropped
dropped
dropped
dropped
Tüm koleksiyonlar düşürüldükten sonra all dropped
yazdırılacağından emin olmanın en basit yolu nedir? Kodu basitleştirmek için herhangi bir 3. parti kullanılabilir.
Promises](http://www.html5rocks.com/en/tutorials/es6/promises/) kullanın.
var mongoose = require('mongoose');
mongoose.connect('your MongoDB connection string');
var conn = mongoose.connection;
var promises = ['aaa', 'bbb', 'ccc'].map(function(name) {
return new Promise(function(resolve, reject) {
var collection = conn.collection(name);
collection.drop(function(err) {
if (err) { return reject(err); }
console.log('dropped ' + name);
resolve();
});
});
});
Promise.all(promises)
.then(function() { console.log('all dropped)'); })
.catch(console.error);
Bu, her koleksiyonu düşürür, her birinden sonra "düştü" yazdırır ve tamamlandığında "hepsi düştü" yazdırır. Eğer bir hata oluşursa, bu stderr
için görüntülenir.
Q](https://github.com/kriskowal/q) vaatlerini veya Bluebird vaatlerini kullanın.
Q** ile:
var Q = require('q');
var mongoose = require('mongoose');
mongoose.connect('your MongoDB connection string');
var conn = mongoose.connection;
var promises = ['aaa','bbb','ccc'].map(function(name){
var collection = conn.collection(name);
return Q.ninvoke(collection, 'drop')
.then(function() { console.log('dropped ' + name); });
});
Q.all(promises)
.then(function() { console.log('all dropped'); })
.fail(console.error);
Bluebird** ile:
var Promise = require('bluebird');
var mongoose = Promise.promisifyAll(require('mongoose'));
mongoose.connect('your MongoDB connection string');
var conn = mongoose.connection;
var promises = ['aaa', 'bbb', 'ccc'].map(function(name) {
return conn.collection(name).dropAsync().then(function() {
console.log('dropped ' + name);
});
});
Promise.all(promises)
.then(function() { console.log('all dropped'); })
.error(console.error);
Gördüğüm kadarıyla mongoose
kullanıyorsunuz, yani sunucu taraflı JavaScript'ten bahsediyorsunuz. Bu durumda async module'e bakmanızı ve async.parallel(...)
kullanmanızı tavsiye ederim. Bu modülü gerçekten yararlı bulacaksınız - mücadele ettiğiniz sorunu çözmek için geliştirilmiştir. Kodunuz aşağıdaki gibi görünebilir
var async = require('async');
var calls = [];
['aaa','bbb','ccc'].forEach(function(name){
calls.push(function(callback) {
conn.collection(name).drop(function(err) {
if (err)
return callback(err);
console.log('dropped');
callback(null, name);
});
}
)});
async.parallel(calls, function(err, result) {
/* this code will run after all calls finished the job or
when any of the calls passes an error */
if (err)
return console.log(err);
console.log(result);
});
Bunu yapmanın yolu, görevlere paylaşılan bir sayacı güncelleyen bir geri arama iletmektir. Paylaşılan sayaç sıfıra ulaştığında, tüm görevlerin bittiğini bilirsiniz, böylece normal akışınıza devam edebilirsiniz.
var ntasks_left_to_go = 4;
var callback = function(){
ntasks_left_to_go -= 1;
if(ntasks_left_to_go <= 0){
console.log('All tasks have completed. Do your stuff');
}
}
task1(callback);
task2(callback);
task3(callback);
task4(callback);
Elbette, bu tür bir kodu daha genel veya yeniden kullanılabilir hale getirmenin birçok yolu vardır ve birçok asenkron programlama kütüphanesinden herhangi biri bu tür bir şeyi yapmak için en az bir fonksiyona sahip olmalıdır.