我有一个生成一些测试数据并将其插入mongodb的函数:
'use strict';
const CvFaker = require('./cv-faker');
const mongoose = require('mongoose');
require('../models/cv_model.js');
module.exports.init = function(){
var cvfaker = new CvFaker();
cvfaker.genCvs(100);
mongoose.model('cv').create(cvfaker.cvs, (err, createdCvs) => {
if(err){
console.log('something went wrong');
}
})
};
我想从命令行执行此代码:
node -e 'require("./create-mock-db").init()'
该函数执行,但它不等待函数完成,因为它是异步的。如何让它等待功能完成?
这也不起作用:
module.exports.init = function(cb){ ...
..
cb();
node -e 'require("./create-mock-db").init(function(){})'
答案 0 :(得分:2)
在事件队列为空之前,node
进程将不会退出。 event loop使用事件队列使异步执行成为可能。
很容易验证这与执行异步代码无关。
node -e "setTimeout(() => console.log('done'), 5000)"
如您所料,此示例需要5秒钟才能运行。
您的代码存在的问题是您从未与数据库建立连接。 model.create
方法在建立连接之前不会执行任何操作,因此不会排队,并且进程可以自由退出。
这意味着您的代码需要更改以做两件事:
model.create
方法。model.create
完成后,与数据库断开连接,因此该过程可以自由退出。答案 1 :(得分:-1)
这个答案可能会吸引更多的人……
// test.js
const request = require('request');
const rp = require('request-promise');
const demo = module.exports.demo = async function() {
try {
const res = await rp.post( {
uri: 'https://httpbin.org/anything',
body: { hi: 'there', },
}, function (error, response, body) {
return error ? error : body;
} )
console.log( res )
return res;
}
catch ( e ) {
console.error( e );
}
};
这样称呼:
$ node -e 'require("./test").demo()'
旁注:
由于它是异步的,它不等待功能完成
它不是异步的。您可能会调用异步函数,但是您并没有将它们视为异步函数,也没有await
未得到任何结果。