为了账号安全,请及时绑定邮箱和手机立即绑定

用JavaScript等待一些异步任务完成的最简单方法?

/ 猿问

用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删除所有收藏集后将被打印的最简单方法是什么?任何第三方都可以用来简化代码。


查看完整描述

3 回答

?
米琪卡哇伊

我看到您正在使用,mongoose因此您正在谈论服务器端JavaScript。在这种情况下,我建议您查看异步模块并使用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);

});


查看完整回答
反对 回复 2019-10-15
?
慕盖茨9453107

使用承诺。


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。


先前的答案(这早于Node对Promises的本地支持):

使用Q承诺或Bluebird承诺。


与Q:


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

与蓝鸟:


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


查看完整回答
反对 回复 2019-10-15
?
萧十郎

这样做的方法是将更新共享计数器的回调传递给任务。当共享计数器达到零时,您知道所有任务都已完成,因此您可以继续进行常规流程。


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

当然,有很多方法可以使这种代码更加通用或可重用,并且那里的许多异步编程库中的任何一个都应该至少具有一个函数来执行这种操作。


查看完整回答
反对 回复 2019-10-15

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信