javascript - AWS 在回调中返回回调

标签 javascript node.js amazon-web-services

我想在我的 AWS 函数的 main 函数中返回一个值。我无法从第一个回调传递数据,因此我可以将其发送到最后一个回调。

  /** 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 的了解不够熟悉。任何帮助将不胜感激。

最佳答案

您可以使用async module使其更具可读性和灵 active ,并且避免了异步问题。 像这样写你的东西

/** 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)
}

关于javascript - AWS 在回调中返回回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39421954/

相关文章:

javascript - Node js : TypeError: Object #<Object> has no method 'existsSync'

node.js - Heroku 命令错误 - Mac OS X Sierra

javascript - 带有 promisify 的 Node 回调样式? "The ' 原来的'参数必须是函数类型'

javascript - 如何在javascript中创建一个对象的foreach?

javascript - 使用 ExtJs 设置文件下载目标

javascript - 悬停时淡出一个元素并淡入另一个元素

javascript - 使用 "Tab"单击执行 "Enter"键的操作,在 Bootstrap 行内

amazon-web-services - 如何在 EMR 集群中运行/安装 oozie

amazon-web-services - 想要通过电子邮件发送云形成输出

amazon-web-services - 如何禁用 S3 存储桶重定向规则?