我正在使用nodejs v6,因此不默认支持异步/等待。我正在尝试为此使用回调模型。我有2个独立的函数,我想将它们组合起来以并行运行:
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:“一些更多数据”},因此尝试转换为以下格式...但是我很困惑如何执行此操作。我知道使用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']
});
}
任何人都可以在这里帮助我。
答案 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);
}
});
});
}