node.js嵌套异步函数

时间:2017-10-30 12:04:05

标签: javascript node.js asynchronous nested

再次是我。我在这里遇到了嵌套异步函数的问题,这些函数不能提供预期的结果。

我有以下代码,它将从目录中获取所有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>

致以最诚挚的问候,

基督教

0 个答案:

没有答案