将JS函数添加到并行队列中

Adding JS functions to a parallel queue

本文关键字:并行 队列 添加 JS 函数      更新时间:2023-09-26

我有这段代码,我想运行所有的数据库插入,然后在脚本结束时断开与数据库的连接。问题是,我需要在循环结束后执行断开连接回调,但这是不确定的。因此,我需要为每个循环创建一个函数,然后只有在所有这些函数完成后,才能调用该函数以断开与mongoose/mongoDB的连接。

有人看到我的代码有问题吗?

//这段代码很接近,但还不完全,因为在进行多次插入/保存之前,它将与mongo断开连接

var mongoose = require('mongoose')
    , Admin = mongoose.mongo.Admin;
var UserModel = require('../models/UserModel');
UserModel.registerSchema(mongoose);

var fs = require('fs');
var parsedJSON = JSON.parse(fs.readFileSync('../dummy_data/dummy_user_data', 'utf8'));

var system_db = mongoose.connect('mongodb://localhost:27017/local_dev_db');

function insertUsers(callback){

    parsedJSON.forEach(function (item, index) {
        var User = UserModel.getNewUser(system_db);
        var user = new User({
            username: item.username,
            password: item.password,
            address: item.address,
            phone: item.phone,
            email: item.email,
            gender: item.gender,
            about: item.about,
            latitude: item.latitude,
            longitude: item.longitude
        });
        user.save(function (err, result) {
            if (err) {
                console.log("error in player save method:", err);
            }
            console.log(index);
            if (result) {
                //console.log('Added!', result);
            }
        });
    });
    callback();
}

function disconnect(){
    mongoose.disconnect();
    mongoose.connection
        .close(function () {
            console
                .log('Mongoose connection disconnected');
            process.exit(0);
        });
}
insertUsers(disconnect);

因此,解决方案是使用async.parallel库,并且只有在完成所有函数之后,才调用最终的回调函数。然而,我如何通过编程来实现这一点,而不是将一组已知的函数放入async.pallel代码块,我需要将未知数量的函数放入aysnc.parallel码块。你看见了吗?

在这种特殊的情况下,async.each()实际上比async.palallel()更适合。async.ech()是并行的,而async.echSeries()不是。这是代码:

function insertUsers(callback){
  var User = UserModel.getNewUser(system_db);
  async.each(parsedJSON, function (item, eachCb) {
    var user = new User({
        username: item.username,
        password: item.password,
        address: item.address,
        phone: item.phone,
        email: item.email,
        gender: item.gender,
        about: item.about,
        latitude: item.latitude,
        longitude: item.longitude
    });
    user.save(function (err, result) {
        if (err) {
            console.log("error in player save method:", err);
        }
        console.log(index);
        if (result) {
            //console.log('Added!', result);
        }
        eachCb();  // if calling with eachCb(err), async.each()
                   // will not continue the rest of the items
                   // in case of error occurs
    });
  }, function(err) {
    callback();    // done with all user.save() calls
  });
}

当然可以。只需将函数动态添加到将传递给async.parallel:的数组中

var fs = require('fs');
var async = require('async');
var mongoose = require('mongoose'),
    Admin = mongoose.mongo.Admin;
var UserModel = require('../models/UserModel');
UserModel.registerSchema(mongoose);
var parsedJSON = JSON.parse(fs.readFileSync('../dummy_data/dummy_user_data', 'utf8'));
var system_db = mongoose.connect('mongodb://localhost:27017/local_dev_db');
var insertFunctions = [];
parsedJSON.forEach(function (item, index) {
    insertFunctions.push(function(callback) {
        var User = UserModel.getNewUser(system_db);
        var user = new User({
            username: item.username,
            password: item.password,
            address: item.address,
            phone: item.phone,
            email: item.email,
            gender: item.gender,
            about: item.about,
            latitude: item.latitude,
            longitude: item.longitude
        });
        user.save(function (err, result) {
            if (err) {
                console.log("error in player save method:", err);
                callback(err);
                return;
            }
             callback(null, result);
        });
    });
});
function disconnect() {
    mongoose.disconnect();
    mongoose.connection
        .close(function () {
            console
                .log('Mongoose connection disconnected');
            process.exit(0);
        });
}
//First parameter is the array of functions to run in parallel,
// second parameter is the callback function
async.parallel(insertFunctions, disconnect);