NodeJS async瀑布中的请求返回undefined

时间:2017-10-11 09:20:01

标签: javascript node.js request async.js waterfall

我对节点js上的async很新。我在解析像这样的xml文件时使用了瀑布方法:

$('situation').each( function(){
var situation = [];
$(this).find('situationRecord').each( function(i){
  var record = this;
  async.waterfall([
    function (callback){
      var filter = {
        startLocationCode: $(record).find('alertCMethod2SecondaryPointLocation').find('specificLocation').text(), 
        endLocationCode: $(record).find('alertCMethod2PrimaryPointLocation').find('specificLocation').text(),
        overallStartTime: $(record).find('overallStartTime').text(),
        overallEndTime: $(record).find('overallEndTime').text()
      }
      callback(null, filter, record);
    },
    function (filter, record, callback){
      var timestamp = new Date().toDateInputValue();
      var startDbResponse = 0;
      var endDbResponse = 0;
      if((filter.startLocationCode != '') && new Date(timestamp) >= new Date(filter.overallStartTime) && new Date(timestamp) <= new Date(filter.overallEndTime) ){
        startDbResponse = locationCodeToGeodataRequst.geodataByLocationcode(filter.startLocationCode);
        endDbResponse = locationCodeToGeodataRequst.geodataByLocationcode(filter.endLocationCode);
      }
      console.log("startDbResponse: ", startDbResponse);
      console.log("endDbResponse: ", endDbResponse);
      callback(null, filter, record, startDbResponse, endDbResponse);
    },
    function (filter, record, startDbResponse, endDbResponse, callback){
     console.log("startDbResponse: ", startDbResponse);
     console.log("endDbResponse: ", endDbResponse);          
     var situationRecord = createSituationRecord($, record, filter.startLocationCode, filter.endLocationCode, startDbResponse, endDbResponse);
      console.log(situationRecord);
    },
    function (situationRecord, callback){
      situation[i] = { situationRecord };
    }
  ],
  function(err, results){
    console.error("There was an error by filtering the xml file");
    console.error(err);
  });
})
if(situation.length > 0){ //if situation is not empty
  locations.push(situation);
}
})
 console.log(locations);
}

在瀑布的这一部分,我使用locationCodeToGeodataRequst.geodataByLocationcode(filter.startLocationCode);向我的数据库发出请求,但startDbResponseendDbResponseundefined

 ....
 function (filter, record, callback){
      var timestamp = new Date().toDateInputValue();
      var startDbResponse = 0;
      var endDbResponse = 0;
      if((filter.startLocationCode != '') && new Date(timestamp) >= new Date(filter.overallStartTime) && new Date(timestamp) <= new Date(filter.overallEndTime) ){

        startDbResponse = locationCodeToGeodataRequst.geodataByLocationcode(filter.startLocationCode);
        endDbResponse = locationCodeToGeodataRequst.geodataByLocationcode(filter.endLocationCode);

      }
      console.log("startDbResponse: ", startDbResponse);
      console.log("endDbResponse: ", endDbResponse);
      callback(null, filter, record, startDbResponse, endDbResponse);
    },
....

它自己的请求是有效的,因为请求模块中的console.log显示正确的数据。所以我不明白为什么它未定义。

这是请求模块:

exports.geodataByLocationcode = function geodataByLocationcode(locationcode){
 let sql = "SELECT * FROM tmc WHERE LOCATION_CODE = " + locationcode;
 let query = db.query(sql, (err, result) =>{
  if(err == null){
    //console.log(result);
    return result;
  }else{
    console.log("Error by getting item from db: " + err);
    throw err;
  }
 });
}

这是一个剪切了console.log:

....
startDbResponse:  undefined
endDbResponse:  undefined
startDbResponse:  undefined
endDbResponse:  undefined
startDbResponse:  0
endDbResponse:  0
startDbResponse:  0
endDbResponse:  0
[]
//here comes the output of the requests as json objects
.... 

1 个答案:

答案 0 :(得分:0)

将控制台日志移动到异步的最后一个功能。正如Manjeet所指出的,异步需要时间和控制台打印。

  function (situationRecord, callback){
  situation[i] = { situationRecord };
  if(situation.length > 0){ //if situation is not empty
    locations.push(situation);
  }
  })
   console.log(locations);
  }
}
相关问题