FOR循环中的HTTP请求未执行

时间:2017-08-18 22:03:27

标签: javascript node.js xmlhttprequest

我有一个脚本,用于执行大量HTTP请求,然后存储检索到的数据:

var ParseXbrl = require('parse-xbrl')
var request = require('request');
var tickers = ['AAPL','F','TSLA','GOOG','MSFT'];

var json = "";
var XML = "";
var Data = [];

for(z in tickers){
request
.get('https://www.valuespreadsheet.com/iedgar/results.php?stock=' + tickers[z] + '&output=json')
.on('response', function(response) {
   response.on('data', function(chunk){
       json += chunk;
   });
   response.on('end',function(){
       json = JSON.parse(json);

       request
           .get(json.filings[2].instanceUrl)
           .on('response', function(response) {
               response.on('data', function(chunk){
                   XML  += chunk;
               });
               response.on('end',function() {
                   ParseXbrl.parseStr(XML).then(function(parsedDoc) {
                     console.log(parsedDoc);
                    var x = 0;
                       for(i in parsedDoc){
                            Data[tickers[z]][x]=parsedDoc[i];
                            x++
                            console.log(Data);
                       }
                   });
               });
               });
             });
   });
 }

上面的脚本返回以下错误代码:

undefined:1
[object Object]{
 ^

SyntaxError: Unexpected token o in JSON at position 1
    at JSON.parse (<anonymous>)
    at IncomingMessage.<anonymous> (Test.js:18:24)
    at emitNone (events.js:110:20)
    at IncomingMessage.emit (events.js:207:7)
    at endReadableNT (_stream_readable.js:1047:12)
    at _combinedTickCallback (internal/process/next_tick.js:102:11)
    at process._tickCallback (internal/process/next_tick.js:161:9)
[Finished in 0.871s]

然而,当我更改数组tickers时,它只包含一个值,例如tickers = ['AAPL']代码有效(我使用的代码是无关紧要的)。

我做了一些测试,发现当我向代码添加console.log(z);时,它会在尝试检索任何数据之前记录01。这导致我怀疑我的代码在执行for(z in tickers)之前循环request

1 个答案:

答案 0 :(得分:1)

您正在构建的JSON字符串在第一次请求后将无效。如果API返回一个对象,您将最终得到:

"{ response1: 'foo'}{ response2: 'bar}{ etc }"

哪个JSON.parse会出错,因为它不是单个对象(并且JSON.parse期望的是什么)。如果它是一个阵列你有类似的问题:

"[responseArray1][responseArray2]"

同样,这不会解析,因为JSON.parse需要单个对象。 Brett的评论是正确的,您需要移动定义json变量的位置:

.on('response', function(response) {
   var json = "";
   response.on('data', function(chunk){
       json += chunk;
   });

这样你就不会连接多个请求响应。

同样适用于XML = '';