使用 async.each 异步遍历猫鼬集合
Asynchronously loop through the mongoose collection with async.each
我在我的节点上使用acync.series
.js程序。我正在尝试用async.each
异步循环猫鼬集合.这是到目前为止的代码:
var async = require('async');
var mongoose = require('mongoose');
var usersData;
async.series([
function(callback) {
mongoose.connect("mongodb://localhost/****");
var db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error...'));
db.once('open', function callback() {
console.log('db opened!');
});
callback();
},
function(callback) {
users = mongoose.model('User', new mongoose.Schema({name: String,age: Number}));
users.find(function(err, userFound) {
if (err) {console.log(err);}
usersData = userFound;
});
callback();
},
function(callback) {
async.each(usersData, function(userData, callback) {
some code....
}, callback);
}
])
当我运行它时,我从异步收到以下错误:
if (!arr.length) {
^
TypeError: Cannot read property 'length' of undefined
异步循环猫鼬集合的正确方法是什么
因为async/await
将是 ES7 并且已经通过转译非常流行,所以在谷歌搜索猫鼬和异步时,这是一个最重要的结果。
虽然没有回答最初的问题,但我想我会把它留给将来参考。
使用原生承诺(请注意,所有用户都是并行处理的(:
const User = mongoose.model('User', new mongoose.Schema({
name: String,
age: Number
}));
function processUsers() {
return mongoose.connect('mongodb://localhost')
.then(function() {
return User.find();
})
.then(function(users) {
const promises = users.map(function(user) {
return // ... some async code using `user`
});
return Promise.all(promises);
});
});
processUsers()
.then(function() {
console.log('Finished');
})
.catch(function(error) {
console.error(error.stack);
});
使用 Mongoose 的eachAsync
每个用户都会按顺序处理:
function processUsers() {
return mongoose.connect('mongodb://localhost')
.then(function() {
return User.find().cursor().eachAsync(function(user) {
return // ... some async code using `user`
});
})
});
使用async/await
:
async function processUsers() {
await mongoose.connect('mongodb://localhost');
await User.find().cursor().eachAsync(async function(user) {
await // ... some async code using `user`
});
}
我认为在我们的例子中最好使用瀑布,像这样
async.waterfall([
function (callback) {
mongoose.connect("mongodb://localhost/****");
var db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error...'));
db.once('open', function () {
callback(null);
});
},
function(callback){
var users = mongoose.model('User', new mongoose.Schema({
name: String,
age: Number
}));
users.find(function(err, userFound) {
if (err) {
return callback(err);
}
callback(null, userFound);
});
},
function(usersData, callback){
async.each(usersData, function(userData, callback) {
}, callback);
}
], function (err, result) {
});
关于瀑布与系列的差异有很好的解释
另一种选择:
functionProcess = (callback) => {
userModel.find().cursor().eachAsync(user => {
return user.save().exec(); // Need promise
}).then(callback); //Final loop
}
相关文章:
- 循环遍历以数组为值的Javascript对象
- 遍历类元素数组,并在jquery中选择同级元素
- Jquery遍历表元素
- Chrome扩展:遍历不同的页面并收集数据
- 如何遍历包含对象的数组-javascript
- 遍历集合中的数组并在Backbone.js中显示
- MongoDB 遍历文档集合
- 遍历一个通用的 JavaScript 集合
- MongoDB - 不明白如何使用光标遍历集合
- 使用 async.each 异步遍历猫鼬集合
- 使用下划线循环遍历集合
- 循环遍历一个集合并返回一个新集合,其中组合了具有相同id的对象
- 循环遍历Firebase数据库记录的集合
- 主干循环遍历并从嵌套集合中获取值
- 循环遍历集合中的jQuery对象,而不为每次迭代初始化一个新的jQuery对象
- 循环遍历RaphaelJS集合
- this.each没有正确地遍历集合
- Javascript循环遍历对象集合
- Meteor - 返回集合 1 中的所有文档,然后查询集合 2 作为循环遍历集合 1
- 如何在Javascript中遍历Java集合