दिलचस्प पोस्ट
कैसे जावा में अंतर मानों को जोड़ना है? JQuery में ईवेंट हैंडलर्स को मैं तर्क कैसे दे सकता हूं? PHP त्रुटि: हेडर सूचना को संशोधित नहीं किया जा सकता है – हेडर पहले ही भेजे गए हैं जावास्क्रिप्ट का उपयोग करने के लिए मैं अपने यूएस-885 9 -1 के समकक्ष विशेष यूटीएफ -8 वर्ण कैसे बदलूं? PHP पुनरावर्ती निर्देशिका पथ क्या मैं एक एंड्रॉइड डिवाइस की एलईडी तीव्रता बदल सकता हूँ? मेरे फ़ंक्शन के अंदर इसे संशोधित किए जाने के बाद क्यों मेरे चर अनियंत्रित हैं? – एसिंक्रोनस कोड संदर्भ रेल। जहां बनाम जावास्क्रिप्ट में मैं क्लिपबोर्ड पर कैसे कॉपी करूं? वैज्ञानिक संकेतन के बिना स्ट्रिंग रूपांतरण के लिए डबल जंग में प्रतिलिपि बनाओ जावा स्विंग; दो वर्गों, जहां बयान और नई कार्रवाई सूची में डाल करने के लिए? JavaScript में संख्या को स्ट्रिंग बदलने का सबसे तेज़ तरीका क्या है? प्रोटोटाइप का प्रयोग करके पाठ संदेश को स्वचालित करना रेगेक्स – एक विशिष्ट पैटर्न को छोड़कर सब कुछ मैच कैसे करें

कुछ असिंक्रोनस कार्यों को पूरा करने का सरल तरीका, जावास्क्रिप्ट में?

मैं कुछ mongodb संग्रह ड्रॉप करना चाहता हूं, लेकिन यह एक अतुल्यकालिक कार्य है। कोड होगा:

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'); 

कंसोल प्रदर्शित करता है:

 all dropped dropped dropped dropped 

यह सुनिश्चित करने का सबसे सरल तरीका क्या है कि सभी संग्रह छोड़े जाने के बाद सभी all dropped जाएंगे? कोई भी तृतीय-पक्ष का उपयोग कोड को सरल बनाने के लिए किया जा सकता है।

वेब के समाधान से एकत्रित समाधान "कुछ असिंक्रोनस कार्यों को पूरा करने का सरल तरीका, जावास्क्रिप्ट में?"

मुझे लगता है कि आप mongoose का प्रयोग कर रहे हैं ताकि आप सर्वर-साइड जावास्क्रिप्ट के बारे में बात कर रहे हों। उस स्थिति में मैं async मॉड्यूल को देख रहा हूं और async.parallel(...) उपयोग करता async.parallel(...) । आपको इस मॉड्यूल को वास्तव में सहायक मिलेगा – यह आप के साथ संघर्ष कर रहे समस्या को हल करने के लिए विकसित किया गया था। आपका कोड ऐसा दिख सकता है

 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); }); 

वादे का प्रयोग करें

 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); 

यह हर संग्रह को छोड़ देता है, हर एक के बाद "गिरा दिया" छपाई करता है, और फिर जब "पूर्ण" समाप्त हो जाता है तब प्रिंट होता है। यदि कोई त्रुटि आती है, तो यह stderr को प्रदर्शित किया stderr


पिछला उत्तर (वादे के लिए नोड के मूल समर्थन का यह पूर्व-तिथि):

क्यू वादे या ब्लूबर्ड वादे का उपयोग करें

क्यू के साथ:

 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 के साथ:

 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); 

ऐसा करने का तरीका एक कॉलबैक को पारित करना है जो साझा किए गए काउंटर को अपडेट करता है। जब साझा किए गए काउंटर शून्य तक पहुंच जाता है, तो आप जानते हैं कि सभी कार्य समाप्त हो गए हैं, ताकि आप अपने सामान्य प्रवाह के साथ जारी रख सकें।

 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); 

बेशक, इस तरह के कोड को अधिक सामान्य या पुन: प्रयोज्य बनाने के कई तरीके हैं और कई एएससीएनसी प्रोग्रामिंग पुस्तकालयों के बाहर इस तरह की बात करने के लिए कम से कम एक फ़ंक्शन होना चाहिए।

@ फ़्रीकिश के जवाब पर विस्तार करना, एसिंक भी प्रत्येक विधि प्रदान करता है, जो आपके मामले के लिए विशेष रूप से अनुकूल है:

 var async = require('async'); async.each(['aaa','bbb','ccc'], function(name, callback) { conn.collection(name).drop( callback ); }, function(err) { if( err ) { return console.log(err); } console.log('all dropped'); }); 

आईएमएचओ, यह कोड को और अधिक कुशल और अधिक सुपाठ्य बनाता है। मैंने console.log('dropped') को निकालने की आज़ादी ली है – यदि आप इसे चाहते हैं, तो इसका उपयोग करें:

 var async = require('async'); async.each(['aaa','bbb','ccc'], function(name, callback) { // if you really want the console.log( 'dropped' ), // replace the 'callback' here with an anonymous function conn.collection(name).drop( function(err) { if( err ) { return callback(err); } console.log('dropped'); callback() }); }, function(err) { if( err ) { return console.log(err); } console.log('all dropped'); }); 

मैं बाहरी पुस्तकालयों के बिना ऐसा करता हूं:

 var yourArray = ['aaa','bbb','ccc']; var counter = []; yourArray.forEach(function(name){ conn.collection(name).drop(function(err) { counter.push(true); console.log('dropped'); if(counter.length === yourArray.length){ console.log('all dropped'); } }); }); 

सभी उत्तर काफी पुराने हैं। 2013 की शुरुआत के बाद से मोंगोज़ ने सभी प्रश्नों के लिए धीरे-धीरे वादों का समर्थन करना शुरू कर दिया था, इसलिए यह अपेक्षित क्रम में कई async कॉलों को संरचित करने का अनुशंसित तरीका होगा I guess

यदि आप बैबेल या ऐसे ट्रांसपॉल्टर का उपयोग कर रहे हैं और एसिंक / का उपयोग कर रहे हैं तो आप ऐसा कर सकते हैं:

 function onDrop() { console.log("dropped"); } async function dropAll( collections ) { const drops = collections.map(col => conn.collection(col).drop(onDrop) ); await drops; console.log("all dropped"); } 

deferred (एक और वादा / स्थगित कार्यान्वयन) के साथ आप यह कर सकते हैं:

 // Setup 'pdrop', promise version of 'drop' method var deferred = require('deferred'); mongoose.Collection.prototype.pdrop = deferred.promisify(mongoose.Collection.prototype.drop); // Drop collections: deferred.map(['aaa','bbb','ccc'], function(name){ return conn.collection(name).pdrop()(function () { console.log("dropped"); }); }).end(function () { console.log("all dropped"); }, null);