var leftpanefilter = {
"organization": [],
"speciality": [],
"city": []
};
dataSource.connector.query(getCitySQL, function(err, citylist) {
if (err) {
console.log("Error getting citylist");
} else {
try {
for (var i = 0; i < citylist.length; i++) {
leftpanefilter.city.push(citylist[i].name);
}
// callback(null, leftpanefilter);
} catch (err) {
console.log(err);
}
}
});
// Get list of organization which has openings
dataSource.connector.query(getOrgSQL, function(err, organizationlist) {
if (err) {
console.log("Error getting organizationlist");
} else {
try {
for (var i = 0; i < organizationlist.length; i++) {
leftpanefilter.organization.push(organizationlist[i].name);
}
} catch (err) {
console.log(err);
}
}
});
// Get list of specialities associated with openings
dataSource.connector.query(getCitySQL, function(err, specialitylist) {
if (err) {
console.log("Error getting specialitylist");
} else {
try {
for (var i = 0; i < specialitylist.length; i++) {
leftpanefilter.speciality.push(specialitylist[i].name);
}
} catch (err) {
console.log(err);
}
}
});
callback(null, leftpanefilter);
由于Nodej的Async特性,回调返回空白数据而不等待查询执行。有谁知道如何使用promise来获取带有查询数据的输出?我无法弄清楚如何使节点等到所有查询完成后。
答案 0 :(得分:0)
作为在这种情况下'可以'工作的一个例子:
var promise = new Promise(function(resolve, reject) {
dataSource.connector.query(getCitySQL, function(err, callback) {
if (err) {
reject(err)
}
else {
resolve(callback)
}
})
}).then(function(specialitylist) {
for (var i = 0; i < specialitylist.length; i++) {
leftpanefilter.speciality.push(specialitylist[i].name);
}
}).catch(function(err) {
console.log('Something went wrong!')
console.log(err)
});
我在这做什么?
我在查询数据库之前创建了一个新的promise,它有两个参数,一个解析(当db成功发送回调时)和拒绝(当出现错误时)。
然后.then()
函数获取resolve的输出,并继续执行您希望对数据执行的任何操作。
.catch()
函数用于处理编码时可能出现的任何错误或问题。
我想这可以帮助你现在的路上,如果你有任何其他问题,请告诉我
答案 1 :(得分:0)
就个人而言,我会在这种情况下使用Promise,如
var queryPromise = function(dataSource, sql, list) {
return new Promise(function(resolve, reject) {
dataSource.connector.query(sql, function(err, data) {
if (err) {
reject("Error getting " + list);
}
resolve(data);
});
});
};
Promise.all([
queryPromise(dataSource, getCitySQL, 'citylist'),
queryPromise(dataSource, getOrgSQL, 'organizationlist'),
queryPromise(dataSource, getCitySQL, 'specialitylist')
]).then(function(results) {
callback(null, {
city: results[0],
organization: results[1],
speciality: results[2]
});
}).catch(function(err) {
console.log(err);
});
这没有错误检查,因为我不知道你会在你的示例案例中做什么
这也取代了您发布的所有代码 - 无需预定义leftpanefilter
注意:承诺全部,这些调用中的任何一个失败,整个事情都被“拒绝” - 并且永远不会调用回调 - 当然你可以自己改变它,但是因为你没有提供关于回调的信息是的,我只能推测这样不会这样做
注意:专业列表SQL与城市相同?你的拼写错误?
略有不同的方法
var queryPromise = function(dataSource, sql, list) {
return new Promise(function(resolve, reject) {
dataSource.connector.query(sql, function(err, data) {
if (err) {
resolve({error: "Error getting " + list});
}
resolve({data: data});
});
});
};
Promise.all([
queryPromise(dataSource, getCitySQL, 'citylist'),
queryPromise(dataSource, getOrgSQL, 'organizationlist'),
queryPromise(dataSource, getCitySQL, 'specialitylist')
]).then(function(results) {
callback(null, {
city: results[0].data || results[0].error,
organization: results[1].data || results[1].error,
speciality: results[2].data || results[2].error
});
});
在这种情况下没有“拒绝”因此,Promise.all将永远解决。发送到callback
的数据中的值可以是数组,也可以是错误的字符串 - 因此,错误检查可以在回调中完成