再次是我。我在这里遇到了嵌套异步函数的问题,这些函数不能提供预期的结果。
我有以下代码,它将从目录中获取所有json文件,然后,对于每个文件,从该文件中获取一些信息。最后,这个getTagList的全部用途是获取json文件列表以及从文件中获取的有关这些文件的信息。
第一个函数是标准的fs.readdir,而第二个函数是我自己的getTagData =函数(app,tagId,callback)。
两者都可以正常工作,但我想要的最终结果(即json文件列表以及这些文件内容的信息)在最终回调中没有正确提供。
请在此处查看我的代码:
var getTagList = function(app, callback){
// get global app variables
var DEBUG = app.get('DEBUG');
var TRACE = app.get('TRACE');
var svrProto = app.get('svrProto');
var svrAddr = app.get('svrAddr');
var svrPort = app.get('svrPort');
var svrApi = app.get('svrApi');
var rfidTagDir = app.get('rfidTagDir');
if (DEBUG) console.log('function getTagList called');
var responseContent = '';
try {
fs.readdir(rfidTagDir, function(err, items) {
if (DEBUG) console.log('working on directory ' + rfidTagDir);
if (err) {
// irgendein Fehler beim einlesen des Verzeichnisses
console.error("error: error occured trying to read directory "+rfidTagDir + '\n error message: ' + err.toString());
// '{\'response\': \'error\', \'message\': \'error getting files from directory '+rfidTagDir+'\', \'exception\': \''+err.toString()+'\'}'
var errCallback = {
response: 'error',
message: 'error getting files from directory ' + rfidTagDir,
error: err.toString()
};
callback(errCallback);
} else if (!items.length) {
// directory appears to be empty
console.warn("warning: nothing to read in directory "+rfidTagDir);
//'{\'response\': \'warning\', \'message\': \'nothing to read from directory '+rfidTagDir+'\'}'
var errCallback = {
response: 'warning',
message: 'nothing to read from directory '+rfidTagDir
};
callback(errCallback);
} else {
// im Verzeichnis sind tatsaechlich Dateien
if (DEBUG) console.log('Anzahl Elemente im Verzeichnis '+rfidTagDir+': ' + items.length);
responseContent = "{\'tags\': ["
//var respCallback = { tags: []};
var tagItemArray = [];
for (i in items) {
if (items[i].toString().substr(items[i].indexOf('.')) == '.json') {
if (DEBUG) console.log('Arbeite auf item ' + items[i]);
var dirItem = '';
// tag-id auslesen, da wir sie gleich brauchen
var tag = items[i].toString().toUpperCase().substring(0,items[i].indexOf('.'));
//\'title\': \'" + tagTitle + "\',
responseContent += "{\'tag\': \'" + tag + "\', \'endpoint\': \'"+svrAddr+':'+svrPort+svrApi+"/tags/tag/" + tag + "\', \'file\': \'"+items[i]+"\'}";
getTagData(app, tag, function(err, result){
if (err) {
console.error('error: could not retrieve tag data for tag ' + tag);
/*
dirItem = {
tag: tag,
endpoint: svrProto+'://'+svrAddr+':'+svrPort+svrApi+'/tags/tag/'+tag,
title: 'no tag info - error: ' + err.toString()
};
*/
} else {
if (DEBUG) console.log('data for tag ' + tag + ' retrieved')
if (TRACE) console.log(dirItem);
var obj = result;
dirItem = {
tag: tag,
endpoint: svrProto+'://'+svrAddr+':'+svrPort+svrApi+'/tags/tag/'+tag,
title: obj.MediaTitle,
genre: obj.MediaGenre,
type: obj.MediaType,
disks: obj.DiskCount,
tracks: obj.TrackCount
};
tagItemArray.push(dirItem);
}
});
//tagItemArray.push(dirItem);
// we only need to add the , after an array element in the json
// structure, if there are sukzessive elements.
if (i<items.length-1) responseContent += ",";
} else {
if (DEBUG) console.log('ignoring file ' + items[i] + ' as it is not a json file');
}
}
responseContent += "]}"
}
if (DEBUG) console.log('taglist ready, providing via callback');
var respCallback = {
tags: tagItemArray
};
if (TRACE) console.log(respCallback);
callback(null, respCallback);
});
} catch (ex) {
console.error("could not read directory "+rfidTagDir+" to list available tags \nException output: " + err.toString());
//'{\'response\': \'error\', \'message\': \'could not read directory '+rfidTagDir+'\', \'exception\': \' '+err.toString()+'\'}'
var errCallback = {
response: 'error',
message: 'could not read tags from directory ' + rfidTagDir,
error: ex.toString()
};
callback(errCallback);
}
}
任何人都可以告诉我,为什么对getTagData()的内部函数调用没有及时提供结果,因此try-block的生成(当然最佳组合)回调包括getTagData的结果??? / p>
致以最诚挚的问候,
基督教