如何在Node.js v6中将顺序函数转换为并行执行

时间:2018-10-05 15:09:27

标签: javascript node.js callback async-await

我正在使用nodejs v6,因此不默认支持异步/等待。我正在尝试为此使用回调模型。我有2个独立的函数,我想将它们组合起来以并行运行:

功能1:

function getUserWidgets1(query, getUserWidgetsCallback) {
    var finalResult = {};
    var userPreferencesDatabaseObject = dbs.userpreferencedbstart("User Preferences: get Widgets ");
    userPreferencesDbHelper.getUserWidgets(userPreferencesDatabaseObject, query, function(result, err){
        dbs.userpreferencedbstop
        (userPreferencesDatabaseObject, 
            "getUserWidgets");
        if(err){
            logger.error(err);
            getUserWidgetsCallback(null, err);
        }else {
            finalResult.data = result.rows;
            getUserWidgetsCallback(finalResult, null);
        }
    });
}

功能2:

    function getAllDefaultWidgets(query, getAllDefaultWidgetsCallback) {
    var finalResult = {};
    var userPreferencesDatabaseObject = dbs.userpreferencedbstart("User Preferences: get widgets lists");
    userPreferencesDbHelper.getAllDefaultWidgets(userPreferencesDatabaseObject, query, function(result, err){
        dbs.userpreferencedbstop(userPreferencesDatabaseObject, "getAllDefaultWidgets");
        if(err) {
            logger.error(err);
            getAllDefaultWidgetsCallback(null, err);
        }else {
            finalResult.data = result.rows;
            getAllDefaultWidgetsCallback(finalResult, null);
        }
    })
}

我基本上是在尝试使用async.parallel组合这两个函数(以并行运行),并从这两个函数返回输出,例如{userWidgets:“ somedata”,defaultWidgets:“一些更多数据”},因此尝试转换为以下格式...但是我很困惑如何执行此操作。我知道使用async /等待它非常简单,但是我不能使用它。

组合功能:

function getUserWidgetsAndDefaultWidget(query, getUserWidgetsCallback) {
    console.log("GOD:: Called.... ");
    async.parallel([
        function(callback) {
            setTimeout(function() {
                callback(null, 'one');
            }, 100);
        },
        function(callback) {
            setTimeout(function() {
                callback(null, 'two');
            }, 100);
        }
    ],
    function(err, results) {
        // has result ['one', 'two']
    });
}

任何人都可以在这里帮助我。

1 个答案:

答案 0 :(得分:0)

我认为,最好的选择是传播并使用Promise.All,例如:

var promisify = require('util').promisify;
var getUserWidgets1P = promisify(getUserWidgets1)
var getAllDefaultWidgetsP = promisify(getAllDefaultWidgetsP );
Promise.all([
  getUserWidgets1P(query)
  getAllDefaultWidgetsP(query)
]).then(function(results){
  results[0] // 1st promise result
  results[1] // 2nd promise result
}).catch(function(err){
  console.log('if any error:',err);
})

或者,如果您尚未在代码的其他位置使用过回调函数,并且不需要向后兼容,即直接将回调函数转换为基于Promise的函数,即

function getUserWidgets1(query) {
  return new Promise(function(resolve,reject){
    var finalResult = {};
    var userPreferencesDatabaseObject = dbs.userpreferencedbstart("User Preferences: get Widgets ");
    userPreferencesDbHelper.getUserWidgets(userPreferencesDatabaseObject, query, function(result, err){
        dbs.userpreferencedbstop
        (userPreferencesDatabaseObject, 
            "getUserWidgets");
        if(err){
            logger.error(err);
            reject(err);
        }else {
            finalResult.data = result.rows;
            resolve(finalResult);
        }
    });
  });
}