Javascript 如何在nodejs中实现异步功能
让我解释一下我的问题。我有一个foreach循环和一个开关条件。在每种切换情况下,我都将结果合并到一个全局数组中Javascript 如何在nodejs中实现异步功能,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,让我解释一下我的问题。我有一个foreach循环和一个开关条件。在每种切换情况下,我都将结果合并到一个全局数组中 var resultArray = []; Panels.forEach(function (panel, index) { switch( panel.CategoryId ){ case 'math': resultArray = resultArray.concat(SOMEVALUE COMES FROM DB); break; case '
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的异步特性。但是我们如何在异步中实现这个函数呢
任何想法都是值得欣赏的要创建类似的同步程序流,您必须在设计中使用回调模式:
functionPerformingQuery(function(result){
handleResult(result);
});
主要思想是:
- 创建一个接受回调函数的函数
- 操作完成后调用回调函数
- 在代码中定义回调函数以访问所有私有变量
在foreach循环中,不需要返回。试试看:
var resultArray=[];
面板.forEach(功能(面板,索引){
开关(panel.CategoryId){
案例“数学”:
resultaray=resultArray.concat(SOMEVALUE来自DB);
打破
“物理学”案例:
resultaray=resultArray.concat(SOMEVALUE来自DB);
打破
“动物学”案例:
resultaray=resultArray.concat(SOMEVALUE来自DB);
打破
}
})
console.log(resultArray)代码>在我看来,因为db上的请求是异步的,所以需要使用承诺来执行结果
查询是在切换条件之前还是之后执行?@MatteoRubini查询是在案例条件内部执行的
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()
}