将我的异步JS代码重构为无法正常工作的函数

时间:2015-08-07 06:26:41

标签: javascript asynchronous

有人帮我写了一小段代码,这些代码对澳大利亚REC Registery进行异步调用,返回一个JSON,其中包含任何特定日期的REC交易数据。 API很简单,唯一要提供的参数是日期。

原始工作代码is here

var https = require('https');
var fs = require('fs');
var options = {
    host: 'rec-registry.gov.au',
    port: 443,
    path: '/rec-registry/app/api/public-register/certificate-actions?date=2015-06-03'
};
var jsonstr = '';

var request = https.get(options, function(response) {
  process.stdout.write("downloading data...");
  response.on('data', function (chunk) {
    process.stdout.write(".");
    jsonstr += chunk;
  });

  response.on('end', function () {
    process.stdout.write("DONE!");
    console.log(' ');
    console.log('Writing to file...');
    fs.writeFile("data.json", jsonstr, function(err) {
      if(err) {
        return console.error('Error saving file'); 
      }
    console.log('The file was saved!');
    });
  });
})

request.on('error', function(e) {
  console.log('Error downloading file: ' + e.message);
});

要开始一个程序,它将遍历一年中的所有日子并保存每天的文件,我需要在函数中使用此代码,这样我就可以传递日期并让它调用并保存返回的任意数据一天。

我的尝试是犯了一个错误,我无法从中推断出任何内容:

var https = require('https'),
    fs = require('fs'),
    moment = require('moment');
/*  
var jsonstr = '{"intialised": "true"},',
    chunks =0;
*/  
var queryDate = '2013-01-01';
var filteredJSON = requestRECs(queryDate);

function requestRECs(date) {
    var dateobj = moment(date),
        options = {
            host: 'rec-registry.gov.au',
            port: 443,
            path: '/rec-registry/app/api/public-register/certificate-actions?date=' + dateobj.format('YYYY-MM-DD')
        },
        jsonstr = '',
        chunks = 0;

    var request = https.get(options, function(response) {
        process.stdout.write("downloading data...");
        response.on('data', function (chunk) {
            process.stdout.write(".");                                              // <— comment out this line for no dots
            jsonstr += chunk; 
            chunks += 1;
        });
        response.on('end', function () {
//          console.log('total chunks transmitted: '+chunks);
            process.stdout.write("DONE!");
//          console.log(' ');
            console.log('Writing to file...');
            fs.writeFile("data" + hyphen + recdate + ".json", jsonstr, function(err) {
                if(err) {
                    return console.error('Error saving file'); 
                }
                console.log('The file was saved for ' + start.format('YYYY-MM-DD'));
                var returnedStatus = JSON.parse(jsonstr).status;
                var results = JSON.parse(jsonstr).result;
                console.log('\nThis date returned the following status message: ' + returnedStatus);
//              console.log('The number of chunks transmitted was: ' + chunks);
//              console.log('The number of elements in result is: ' + results.length);
//              if (results) console.log('number of results is: ' + results.length);
            });
        });     
    }
    request.on('error', function(e) {
        console.log('Error downloading file: ' + e.message);
    });

}

错误是:

/Users/aleith/Documents/node/request-single-date-recs.js:51   <— this line is the last line of the code
}
^
SyntaxError: Unexpected token }

如果我将request.on('error',…块向下移动到函数的底部,我会收到此错误:

/Users/aleith/Documents/node/request-single-date-recs.js:47     <— this line is the request.on line
    request.on('error', function(e) {
    ^^^^^^^
SyntaxError: Unexpected identifier

我还尝试完全删除此错误处理块但没有成功。

下一个问题是因为https调用是异步的,所以我只能编写将在reponse.on('end', function (){…})块内完全返回数据后执行的代码。

我认为这意味着我需要让我的日期迭代例程暂停,直到它从这个块获取消息(如何?)或者我从该块内部递归调用该函数并在函数顶部进行测试以查看如果当前requestDate等于结束数据,那么它就会爬出递归兔子洞。

但首先我需要在我采用这种复杂性之前获得一个基本的单日期函数,可能是一个单独的SO问题(?)

1 个答案:

答案 0 :(得分:1)

你错过了一个);在第46行。