2016-09-10 15 views
0

AWS関数のメインで値を返したいと考えています。最初のコールバックからデータを渡すことができないので、最後のコールバックに送信できます。AWSはコールバック内でコールバックを返します

/** module used for outbound http requests */ 
    var request = require('request'); 

    /** module used for parsing XML easily. https://www.npmjs.com/package/xml2js*/ 
    var parseString = require('xml2js').parseString; 
exports.handler = (event, context, callback) => { 

    // testing array of coordinates 
    var arrayOfPoints = [39.7683800, -86.1580400, 41.881832, -87.623177]; 
    var results = getXMLFromNOAA(arrayOfPoints); 
    callback(null, results); // <- returns 'undefined' in the AWS console. I'm assuming race condition. 
}; 

/** 
* getXMLFromNOAA 
* 
* This is a function used for figuring out the functionality of NOAA XML parsing 
* 
* @param arrayOfPoints {Array[Double]} - An evenly numbered index array of latitudes and longitudes 
* 
* @return result {XML/JSON} - weather information abled to be parsed 
*/ 
function getXMLFromNOAA(arrayOfPoints, callback) { 

    var baseURL = "http://graphical.weather.gov/xml/sample_products/browser_interface/ndfdXMLclient.php?whichClient=NDFDgenLatLonList&lat=&lon=&listLatLon="; 

    // for-loop getting all points and dynamically adding them to the query url string 
    // iterate 2 at a time since they are coupled coordinates (e.g. [lat1, lng1, lat2, lng2, ... latN, lngN]) 
    for(var i = 0; i < arrayOfPoints.length; i = i + 2) 
    { 
     // if we're at the end of the arrayOfPoints, finish up the chain of query coordinates 
     if((i+2) == arrayOfPoints.length) 
     { 
      baseURL = baseURL.concat(arrayOfPoints[i]); 
      baseURL = baseURL.concat("%2C"); 
      baseURL = baseURL.concat(arrayOfPoints[i+1]); 
     } 
     else 
     { 
      baseURL = baseURL.concat(arrayOfPoints[i]); 
      baseURL = baseURL.concat("%2C"); 
      baseURL = baseURL.concat(arrayOfPoints[i+1]); 
      baseURL = baseURL.concat("+"); 
     } 
    } 

    // TIME 
    baseURL = baseURL.concat("&lat1=&lon1=&lat2=&lon2=&resolutionSub=&listLat1=&listLon1=&listLat2=&listLon2=&resolutionList=&endPoint1Lat=&endPoint1Lon=&endPoint2Lat=&endPoint2Lon=&listEndPoint1Lat=&listEndPoint1Lon=&listEndPoint2Lat=&listEndPoint2Lon=&zipCodeList=&listZipCodeList=&centerPointLat=&centerPointLon=&distanceLat=&distanceLon=&resolutionSquare=&listCenterPointLat=&listCenterPointLon=&listDistanceLat=&listDistanceLon=&listResolutionSquare=&citiesLevel=&listCitiesLevel=&sector=&gmlListLatLon=&featureType=&requestedTime=&startTime=&endTime=&compType=&propertyName=&product=time-series&begin=2016-09-04T00:00:00&end=2016-09-11T00:00:00"); 

    // CHARACTERISTICS REQUESTED 
    // http://graphical.weather.gov/xml/docs/elementInputNames.php 
    baseURL = baseURL.concat("&Unit=e&maxt=maxt&mint=mint&temp=temp&appt=appt&rh=rh&sky=sky&wwa=wwa&iceaccum=iceaccum&ptornado=ptornado&phail=phail&ptstmwinds=ptstmwinds&pxtornado=pxtornado&pxhail=pxhail&ptotsvrtstm=ptotsvrtstm&wgust=wgust"); 

    // Used for testing and seeing the final result 
    console.log(baseURL); 

    request(baseURL, function (error, response, body) 
    { 
     if (!error && response.statusCode == 200) 
     { 
      parseString(body, function (err, result) { 
       console.log('inside parseString: ' + result); // <- this prints but it won't show up in the main 
       // callback(null, result); <- doesnt work 
       return result; // doesnt work either 
      }); 
     } 
    }) 
} 

スケーラビリティのために自分のコードをモジュール化したいと考えています。私は、getXMlFromNOAAの非同期処理を繰り返し実行する方法を知っています。私はJavaScriptに慣れていないだけです。どんな助けでも本当に感謝しています。

答えて

2

async moduleを使用すると、読みやすく柔軟性が高く、非同期の問題がなくなります。 この

/** module used for outbound http requests */ 
var request = require('request'); 
var async = require('async'); 

/** module used for parsing XML easily. https://www.npmjs.com/package/xml2js*/ 
var parseString = require('xml2js').parseString; 
exports.handler = (event, context, callback) => { 

    async.waterfall([ 

     function(next) { 
      // testing array of coordinates 
      var arrayOfPoints = [39.7683800, -86.1580400, 41.881832, -87.623177]; 
      var results = getXMLFromNOAA(arrayOfPoints, next); 

     }, 
     function(baseURL, next) { 

      request(baseURL, function(error, response, body) { 
       if (!error && response.statusCode == 200) { 
        parseString(body, function(err, result) { 
         console.log('inside parseString: ' + result); // <- this prints but it won't show up in the main 
         if (!err) 
          next(null, result); 
        }); 
       } 
      }) 

     } 
    ], function(err, result) { 
     if (!err) { 
      callback(null, results); // <- returns 'undefined' in the AWS console. I'm assuming race condition. 
     } 

    }) 

}; 

/** 
* getXMLFromNOAA 
* 
* This is a function used for figuring out the functionality of NOAA XML parsing 
* 
* @param arrayOfPoints {Array[Double]} - An evenly numbered index array of latitudes and longitudes 
* 
* @return result {XML/JSON} - weather information abled to be parsed 
*/ 
function getXMLFromNOAA(arrayOfPoints, next) { 

    var baseURL = "http://graphical.weather.gov/xml/sample_products/browser_interface/ndfdXMLclient.php?whichClient=NDFDgenLatLonList&lat=&lon=&listLatLon="; 

    // for-loop getting all points and dynamically adding them to the query url string 
    // iterate 2 at a time since they are coupled coordinates (e.g. [lat1, lng1, lat2, lng2, ... latN, lngN]) 
    for (var i = 0; i < arrayOfPoints.length; i = i + 2) { 
     // if we're at the end of the arrayOfPoints, finish up the chain of query coordinates 
     if ((i + 2) == arrayOfPoints.length) { 
      baseURL = baseURL.concat(arrayOfPoints[i]); 
      baseURL = baseURL.concat("%2C"); 
      baseURL = baseURL.concat(arrayOfPoints[i + 1]); 
     } else { 
      baseURL = baseURL.concat(arrayOfPoints[i]); 
      baseURL = baseURL.concat("%2C"); 
      baseURL = baseURL.concat(arrayOfPoints[i + 1]); 
      baseURL = baseURL.concat("+"); 
     } 
    } 

    // TIME 
    baseURL = baseURL.concat("&lat1=&lon1=&lat2=&lon2=&resolutionSub=&listLat1=&listLon1=&listLat2=&listLon2=&resolutionList=&endPoint1Lat=&endPoint1Lon=&endPoint2Lat=&endPoint2Lon=&listEndPoint1Lat=&listEndPoint1Lon=&listEndPoint2Lat=&listEndPoint2Lon=&zipCodeList=&listZipCodeList=&centerPointLat=&centerPointLon=&distanceLat=&distanceLon=&resolutionSquare=&listCenterPointLat=&listCenterPointLon=&listDistanceLat=&listDistanceLon=&listResolutionSquare=&citiesLevel=&listCitiesLevel=&sector=&gmlListLatLon=&featureType=&requestedTime=&startTime=&endTime=&compType=&propertyName=&product=time-series&begin=2016-09-04T00:00:00&end=2016-09-11T00:00:00"); 

    // CHARACTERISTICS REQUESTED 
    // http://graphical.weather.gov/xml/docs/elementInputNames.php 
    baseURL = baseURL.concat("&Unit=e&maxt=maxt&mint=mint&temp=temp&appt=appt&rh=rh&sky=sky&wwa=wwa&iceaccum=iceaccum&ptornado=ptornado&phail=phail&ptstmwinds=ptstmwinds&pxtornado=pxtornado&pxhail=pxhail&ptotsvrtstm=ptotsvrtstm&wgust=wgust"); 

    // Used for testing and seeing the final result 
    console.log(baseURL); 
    //retun to callback after getting URL 
    next(null, baseURL) 
} 
+0

美しい作品、ありがとうございます – booky99

+0

お願いしますupvote :) – abdulbarik

0

コールバックがどのように動作するかではないのthatsのように自分のものの何かを書きなさい。このような何かにハンドラを変更します。

exports.handler = (event, context, callback) => { 
    var arrayOfPoints = [39.7683800, -86.1580400, 41.881832, -87.623177]; 
    getXMLFromNOAA(arrayOfPoints, function(result) { 
    console.log('returned'); 
    console.log(result); 
    callback(null, result); 
    }); 
}; 

またgetXMLFromNOAAcallback(result)へ(戻る)コメントを解除。

また、NOAAにはモジュールがあります。ホイールを再設計する前に、まずnode-modules/npmjs.com/npms.ioを検索してください。ここの例のhttps://github.com/thataustin/noaa-forecastsはあなたがやっているのと非常によく似ていますので、私はそれから始めます。

将来的に非同期のものを簡略化したい場合は、とasyncawaitというキーワードを使用できます。しかし、あなたは本当にコールバックと約束を最初に学ぶことを確認する必要があります。

関連する問題