从命令行,节点js运行异步代码

时间:2016-08-03 15:07:47

标签: javascript node.js

我有一个生成一些测试数据并将其插入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(){})'

2 个答案:

答案 0 :(得分:2)

在事件队列为空之前,node进程将不会退出。 event loop使用事件队列使异步执行成为可能。

很容易验证这与执行异步代码无关。

node -e "setTimeout(() => console.log('done'), 5000)"

如您所料,此示例需要5秒钟才能运行。


您的代码存在的问题是您从未与数据库建立连接。 model.create方法在建立连接之前不会执行任何操作,因此不会排队,并且进程可以自由退出。

这意味着您的代码需要更改以做两件事:

  1. 连接到数据库,以便可以执行model.create方法。
  2. 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未得到任何结果。