如何等待findOneAndUpdate完成,然后再继续async.series
How to wait for findOneAndUpdate to finish before continuing async.series
我有一个种子文件设置来填充我的mongodb。我正在设置一个计数器,以便在将新配方添加到数据库时自动增加值。现在我正在使用 async.series 来运行种子文件中的不同任务。在我包含的内容中,您可以看到我在哪里设置recipe_id等于此方法返回值getNextSequence(计数器,"recipeid")
getNextSequence 使用计数器模型来查询 (findOneAndUpdate) 数据库。我相信 findOneAndUpdate 的回调永远不会被调用,因为首先调用了 async.series 的回调。这是一个有趣的问题,因为我需要确保getNextSequence在继续之前已成功返回。不确定最好的方法。
//种子.js//不完整
var getNextSequence = require('./utils/getNextSequence').getNextSequence;
recipes = new mongo.Collection(db, "recipes");
counters = new mongo.Collection(db, "counters");
async.series([
function(callback){
//initiate counter
counters.insert(
{
_id: "recipeid",
seq: 0
},function(err, rec){
callback(err, rec);
})
},
function(callback){
//add test recipes
recipes.insert([{
recipe_id: getNextSequence(counters, "recipeid"),
title:'title 1',
body:'body 1',
author: [seedUsers[1]._id],
categories: [ seedCategories[0]._id, seedCategories[1]._id ],
create_at: new Date()
},{
recipe_id: getNextSequence(counters, "recipeid"),
title:'title 2',
body:'body 2',
author: [seedUsers[1]._id],
categories: [ seedCategories[1]._id ],
create_at: new Date()
}], function(err, rec){
callback(err, rec);
})
}
],
// optional callback
function(err, results){
//console.log(''n', results);
db.close();
});
//getNextSequence.js
var Counter = require('../counter').Counter;
exports.getNextSequence = function(counters, name) {
Counter.findOne({ '_id': 'recipeid' }, function (err, counter) {
//if (err) return handleError(err);
//never called
console.log('---counter seq=', counter.seq);
})
Counter.findOneAndUpdate({ _id: name }, { $inc: { seq: 1 } }, { new: true }, function(err, counter){
//never called
console.log('counter.seq', counter.seq);
return counter.seq;
}
)
}
我不确定您使用的是哪个异步库,让我们假设它是这个 https://github.com/caolan/async
您可能需要先运行getNextSequence
,然后再插入收据。稍微更改一下getNextSequence,以便async
知道findOneAndUpdate
过程何时完成。我也改用waterfall
,所以一个任务的结果被传递给下一个任务
var Counter = require('../counter').Counter;
exports.getNextSequence = function (counters, name, callback) {
Counter.findOne({'_id': 'recipeid'}, function (err, counter) {
//if (err) return handleError(err);
//never called
console.log('---counter seq=', counter.seq);
})
Counter.findOneAndUpdate({_id: name}, {$inc: {seq: 1}}, {new: true}, function (err, counter) {
//never called
console.log('counter.seq', counter.seq);
callback(null, counter.seq);
}
)
}
播种
var getNextSequence = require('./utils/getNextSequence').getNextSequence;
recipes = new mongo.Collection(db, "recipes");
counters = new mongo.Collection(db, "counters");
async.waterfall([
function (callback) {
//initiate counter
counters.insert(
{
_id: "recipeid",
seq: 0
}, function (err, rec) {
callback(err, rec);
})
},
function (callback) {
getNextSequence(counters, "recipeid", callback);
},
function (seq, callback) {
//add test recipes
recipes.insert({
recipe_id: seq,
title: 'title 1',
body: 'body 1',
author: [seedUsers[1]._id],
categories: [seedCategories[0]._id, seedCategories[1]._id],
create_at: new Date()
}, function (err, rec) {
callback(err, rec);
})
},
function (callback) {
getNextSequence(counters, "recipeid", callback);
},
function (seq, callback) {
//add test recipes
recipes.insert({
recipe_id: seq,
title: 'title 2',
body: 'body 2',
author: [seedUsers[1]._id],
categories: [seedCategories[1]._id],
create_at: new Date()
}, function (err, rec) {
callback(err, rec);
})
}
],
// optional callback
function (err, results) {
//console.log(''n', results);
db.close();
});
相关文章:
- 多个下载链接到一个zip文件,然后再下载javascript
- 使用Angular存储用户以前是否选中过复选框,然后再调用它的最佳方式是什么
- 如何在VB中先执行客户端代码,然后再执行服务器端代码
- 我如何从字符串中选出第一个单词的第一个字母,然后再选出第二个单词
- Javascript:将多个表打印成一行,然后再打印
- jquery通过ajax验证电子邮件,然后再通过ajax提交表单
- 先在Angular中加载配置文件,然后再加载其他文件
- 等待函数执行后再继续
- 等待 AJAX,然后再继续执行单独的函数
- 使用生成器等待输入,然后再继续 forEach 循环的主体
- 等待多个 ipc 调用完成,然后再继续电子/冗余
- 如何等待findOneAndUpdate完成,然后再继续async.series
- 等待 API 调用在 Javascript 中完成,然后再继续
- Angular2 可观察 - 等待多个函数调用,然后再继续
- 等待方法的响应,然后再继续而不使用 SJAX
- 等待 .each 完成,然后再继续 (jQuery)
- JavaScript等待,直到一个图像完全加载,然后再继续脚本
- 在Javascript中,如何使用ajax调用等待一个函数完成,然后再继续使用另一个函数
- 等待按钮单击,然后再继续
- 如何使代码在单击按钮后等待 X 秒,然后再继续