2017-08-23 2 views
0

Vielen Dank für den Blick in den Code.mehrere http get Anrufe nodejs

Hier hole ich einige Daten mit Feed-Parser und herausnehmen IDs in Navcodes Array-Variable und möchte diese Id verwenden, um HTTP-Aufruf zu machen. Bitte Code unten finden.

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 
    }); 
} 

Ich habe auch versucht, direkt die insertbulkMFValues ​​zu nennen, wie jetzt aber wegen asynchroner Natur NodeJS kommentiert, erhalte ich den Fehler entweder ‚Sockel aufzulegen‘ oder ‚lesen ECONNRESET‘. Ich überprüfte und verwendete Async, konnte aber auch nicht damit arbeiten.

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(); 
} 

Vielen Dank im Voraus .. J

Antwort

0

Sie direkt insertbulkMFValues für jeden Navcode wie anrufen:

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

Alles, was Sie tun wollen innerhalb der Callback der asynchronen Funktion sein muss, . unter Verwendung der erhaltenen Codes für Sie Eine Möglichkeit ist, den Wasserfall oder parallel Methode der Asynchron-Bibliothek zu verwenden, um alle für jede ID-Feeds abrufen und dann

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

innerhalb des Endergebnisses Rückruf aufrufen.