让我解释一下我的问题。我有一个foreach循环和一个切换条件。在每个开关的情况下,我都将结果连接到一个全局数组。
var resultArray = [];
Panels.forEach(function (panel, index) {
switch( panel.CategoryId ){
case 'math':
resultArray = resultArray.concat(SOMEVALUE COMES FROM DB);
break;
case 'physics':
resultArray = resultArray.concat(SOMEVALUE COMES FROM DB);
break;
case 'zoology':
resultArray = resultArray.concat(SOMEVALUE COMES FROM DB);
break;
}
return resultArray;
})
但是输出并不包含所有情况下的值。我知道它是因为nodejs的异步性质。但是我们如何将这个函数实现为异步?
任何想法都会很明显
答案 0 :(得分:0)
要创建类似的同步程序流程,您必须在设计中使用回调模式:
functionPerformingQuery(function(result){
handleResult(result);
});
主要观点是:
- 创建一个接受回调函数的函数
- 在操作完成时调用回调函数
- 在代码中定义回调函数以访问所有私有变量
更标准化的方法是承诺()
答案 1 :(得分:0)
在foreach循环中,没有必要作为回报。试试吧:
var resultArray = [];
Panels.forEach(function (panel, index) {
switch( panel.CategoryId ){
case 'math':
resultArray = resultArray.concat(SOMEVALUE COMES FROM DB);
break;
case 'physics':
resultArray = resultArray.concat(SOMEVALUE COMES FROM DB);
break;
case 'zoology':
resultArray = resultArray.concat(SOMEVALUE COMES FROM DB);
break;
}
})
console.log(resultArray);
答案 2 :(得分:0)
在我看来,因为db上的请求是异步的,你需要使用promise Jquery Promise执行结果
var resultArray = [];
Panels.forEach(function (panel, index) {
switch( panel.CategoryId ){
case 'math':
myDBfunction().then(function(result) {
resultArray = resultArray.concat(result);
});
break;
case 'physics':
myDBfunction().then(function(result) {
resultArray = resultArray.concat(result);
});
break;
case 'zoology':
myDBfunction().then(function(result) {
resultArray = resultArray.concat(result);
});
break;
}
return resultArray;
})
function myDBfunction() {
var deferred = new jQuery.Deferred();
// do some with DB (not real code)
mysql.query("SELECT * ....", function(dbError, dbResult) {
deferred.resolve(dbResult);
})
return deferred.promise()
}