javascript - 在Javascript中等待一些异步任务完成的最简单方法?

标签 javascript node.js asynchronous mongoose synchronous

我想删除一些 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 的最简单方法是什么?任何 3rd-party 都可以用来简化代码。

最佳答案

使用 Promises .

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

这会丢弃每个集合,在每个集合之后打印“dropped”,然后在完成时打印“all dropped”。如果发生错误,则显示到 stderr


上一个答案(这早于 Node 对 Promises 的原生支持):

使用 Q promise 或 Bluebird promise 。

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

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

关于javascript - 在Javascript中等待一些异步任务完成的最简单方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10551499/

相关文章:

javascript - Python 与 JavaScript 交互?

C#异步对象

c# - 对异步 mvc Controller 的异步 jquery 调用

javascript - Node js将变量传递给请求回调函数

mysql - Knex.js 查询抛出警告 "Calling knex without a tableName is deprecated"

node.js - Node 和 Passport : stay on the same page after login

php - 如何在网站之间传输javascript数据?

javascript - 为具有计数效果的元素添加宽度

javascript - 隐藏 div 在 jQuery Ajax 成功中无法正常工作

javascript - Nuxt.js 代码在从数组计算数据时给出 NaN 错误