javascript - 如何在 node js v6 中将顺序函数转换为并行执行

标签 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);
        }
    });
}

功能二:

    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: "some more data"} 因此我在尝试以下面的格式转换...但我很困惑如何做到这一点。我知道使用 async/await 它非常简单,但我不能使用它。

组合函数:

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']
    });
}

谁能帮帮我。

最佳答案

我认为 promise 和使用 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);
        }
    });
  });
}

关于javascript - 如何在 node js v6 中将顺序函数转换为并行执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52668595/

相关文章:

javascript - 处理表单时显示图像时出错

javascript - 切换功能不工作 div 元素不出现

javascript - Node js在查询记录时自动将MySQL中的GMT格式日期转换为本地格式

arrays - $in 在环回中不起作用

javascript - 向请求回调添加额外的参数。

javascript - 如何正确插入回调函数,让一个函数结束后再执行另一个函数

java - 适用于 Yahoo utils 的 Netbeans 智能感知

node.js - 火力地堡云函数 : Querying Nodes

android - OkHttp 与 socket.io 兼容吗?

python - Bokeh 多选小部件回调不起作用