как преобразовать последовательную функцию в параллельное выполнение в nodejs v6 - PullRequest
0 голосов
/ 05 октября 2018

Я использую nodejs v6 и, следовательно, по умолчанию нет поддержки async / await.Я пытаюсь использовать модель обратного вызова для этого.У меня есть 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: "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']
    });
}

Может кто-нибудь, пожалуйста, помогите мне здесь.

1 Ответ

0 голосов
/ 05 октября 2018

Я думаю, что обещание и использование 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);
})

Или, непосредственно, преобразуйте свои функции обратного вызова в функцию, основанную на обещаниях, если вы еще не использовали их в других местахв вашем коде и не нуждаются в обратной совместимости, т.е.

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);
        }
    });
  });
}
...