父功能不等待孩子完成

问题描述 投票:-2回答:1

在getMetadata()内部,Object.keys函数不等待httprequest完成。如何使object.keys函数等到httprequest函数操作结果变量?

我正在使用节点。我试图做出承诺但失败了。

function fetchAirportPageIDsListWithMetaJSON(faa, cb){
    logger.info('[airportcms-data-processor] fetching airport pages list with Metadata');
    var faa = faa
    async.waterfall([
    getAirportPageIDsList,
    getMetadata,
    ], function (err, result) {
        cb(null, result);
    });
    function getAirportPageIDsList(callback) {
        httpRequests.fetchData('//s3 url to fetch data', function (err, data) {
            var idsMap={};
            data["page-ids"].forEach( (obj) => {
                    obj.list.forEach((item) => idsMap[item] = obj.id);
                });
            callback(null, idsMap);
        })
    }
    function getMetadata(data,callback) {
        var result=[];
        Object.keys(data).sort().forEach( function (t) {
                var tempJson={};
                var urlcheck = verifySpecialPageId(t);
                if (urlcheck){
                        var url = config.urls.s3_airports_base_url+'/'+faa+'/'+urlcheck;
                    }else{
                        var url = config.urls.s3_airports_base_url+'/'+faa+'/'+t;
                    }
                            tempJson["sectionId"]= t;
                            tempJson["page"]= data[t];
                    httpRequests.makeHeadRequestWithCallerId(url, function (err, metax) {
                         if (metax){
                                      let z = metax.split('|')[0];
                          tempJson["SummaryRange"]= getSummaryRangeAirportPageList(z);
                          tempJson["timestamp"]= new Date(parseInt(z)).toLocaleDateString();
                          tempJson["callerId"]= metax.split('|')[1];
                        }else{
                                      tempJson["timestamp"]='';
                                      tempJson["callerId"]='';
                                      tempJson["SummaryRange"]='';
                                }
                                })
                                result.push(tempJson);
                            });


            logger.info("Final result: ", result);
            callback(null, result);
    }
}

http请求功能:

function makeHeadRequestWithCallerId (url, cb) {
    httpRequest.head(url, function (err, res) {
        if (err) {
            logger.error('Error ' + err);
            return cb(err, null);
        }
        if(res.code === 200) {
            if (res.headers['x-amz-meta-x-amz-meta-lastmodified'] || res.headers['x-amz-meta-x-amz-meta-callerid']) {
                var dateModified = res.headers['x-amz-meta-x-amz-meta-lastmodified'];
                var timeStamp = Date.parse(dateModified);
                var callerid = res.headers['x-amz-meta-x-amz-meta-callerid'];

                if(timeStamp && callerid) {
                    return cb(null, timeStamp+'|'+callerid);
                } else if (callerid){
                    return cb(null, '|'+callerid);
                }else if(timeStamp){
                    return cb(null, timeStamp+'|');
                }else{
                    return cb(null, null);
                }
            }else{
                return cb(null, null);
            }
        }
    });
}

当前日志=>最终结果:

[{ sectionId: 'internet-wifi', page: 'internet-wifi' },
{ sectionId: 'layover-ideas', page: 'layover-ideas' }]

预期日志=>最终结果:

{ sectionId: 'internet-wifi',
    page: 'internet-wifi',
    SummaryRange: '12-99',
    timestamp: '1/29/2018',
    callerId: '' },
  { sectionId: 'layover-ideas',
    page: 'layover-ideas',
    SummaryRange: '12-99',
    timestamp: '1/26/2017',
    callerId: '' },
node.js async.js
1个回答
0
投票
function getMetadata(data, callback) {
    var result = [];
    var count = Object.keys(data).length;
    var i = 0;
    Object.keys(data).sort().forEach(function (t) {
        var tempJson = {};
        var urlcheck = verifySpecialPageId(t);
        if (urlcheck) {
            var url = config.urls.s3_airports_base_url + '/' + faa + '/' + urlcheck;
        } else {
            var url = config.urls.s3_airports_base_url + '/' + faa + '/' + t;
        }
        tempJson["sectionId"] = t;
        tempJson["page"] = data[t];

        httpRequests.makeHeadRequestWithCallerId(url, function (err, metax) {
            if (metax) {
                let z = metax.split('|')[0];
                tempJson["SummaryRange"] = getSummaryRangeAirportPageList(z);
                tempJson["timestamp"] = new Date(parseInt(z)).toLocaleDateString();
                tempJson["callerId"] = metax.split('|')[1];
            } else {
                tempJson["timestamp"] = '';
                tempJson["callerId"] = '';
                tempJson["SummaryRange"] = '';
            }
            result.push(tempJson);
            i++;
            if(count === i){
                logger.info("Final result: ", result);
                callback(null, result);
            }
        })

    });    
}
© www.soinside.com 2019 - 2024. All rights reserved.