多个http get调用nodejs

时间:2017-08-23 20:35:44

标签: node.js https request node-async

感谢您查看代码。

这里我使用feed解析器获取一些数据,并在navcodes数组变量中取出id并希望使用这些Id进行http调用。请在下面找到代码。

function processNavCode(){
    var mfId = [53];
    var preTitle = '';
    var navCodes = [];
    mfId.forEach(function(id){
        var query = "http://portal.xyz.com/Rss.aspx?mf="+id;
        feed(query, function(err, feeds) {
            if (err) {
                throw err;
            }
            feeds.forEach(function(feed){
                var link = feed.link;
                var title = feed.title;
                var navCode = link.substr(link.length - 6);
                if(title.split('-')[0].trim() != preTitle){
                    preTitle = title;
                    counter ++;
                }
                if(parseInt(navCode) != '')
                    navCodes.push = parseInt(navCode);
            });
        });
        async.eachSeries(navCodes,insertbulkMFValues,function(){
            console.log('I am done');
        });

// insertbulkMFValues(navCode);
//Directly call insertbulkMFValues  function
    });
}

我还尝试直接调用insertbulkMFValues作为注释,但由于nodejs的异步性质,我得到的错误是“Socket挂机”。或者'阅读ECONNRESET'。我检查并使用了异步,但也无法使用它。

var insertbulkMFValues  =function(navCode,callback){
    var options = {
        host: 'www.quandl.com',
        path: '/api/v3/datasets/AMFI/'+navCode+'.json?api_key=123456789&start_date=2013-08-30',
        method: 'GET',
        headers: {
            'Content-Type': 'application/json'
        }
    }
    var req1 = https.request(options, function(response) {
        var body = '';
        response.setEncoding('utf8');
        response.on('data', function(chunk) {
            body += chunk;
        });
        response.on('end', function() {
            if(typeof body === "string") {
                var json = JSON.parse(body);
            }
            var mfData = json.dataset.data;
            var schemeId = json.dataset.dataset_code;
            var schemeName = json.dataset.name;
            var isinCode = json.dataset.description;
            var valueData=[];
            for (var k = 0; k < mfData.length; k++) {
                var myDate = new Date(mfData[k][0]);
                valueData.push({
                    date:myDate,
                    NAV:parseFloat(mfData[k][1]).toFixed(2)
                }); 
            }
            var query = { "navCode": schemeId };
            var newData = { 
                createdDate: Date.now(),
                navCode: schemeId,
                schemeCode:count,
                schemeName:schemeName,
                ISINCode:isinCode,
                values:valueData
            };
            MHistory.findOneAndUpdate(query, newData , {upsert:true}, function(err, doc){
            if(err)
                console.log('Errorr');
            else
                console.log('Success');
        });    
    });
});
    req1.on('error', function(e) {
        console.log('problem with request: ' + e.message);
        callback(true);
    });
    req1.end();
}

提前致谢.. Ĵ

2 个答案:

答案 0 :(得分:0)

您可以直接为每个navCode调用insertbulkMFValues,如:

if(parseInt(navCode) != '') {
     insertbulkMFValues(navCode, function () {
        console.log('something'} 
     });
}

答案 1 :(得分:0)

您打算做的任何事情都必须在异步函数的回调中。 一个选项是使用异步库的瀑布或并行方法来检索每个id的所有提要,然后调用

    async.eachSeries(navCodesAccumulated,insertbulkMFValues,function(){
        console.log('I am done');
    });

使用获得的代码在最终结果回调中。