我使用的是 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/