2016-01-31 8 views
1

Я делаю HTTPS запрос, как это:Как узнать, когда будут получены все ломти

var req = https.request(options, function (res) { 
    console.log('statusCode: ', res.statusCode); 
    console.log('headers: ', res.headers); 

    res.on('data', function (d) { 
     // how to know when all chunks are received 
     process.stdout.write(d); 
    }); 
}); 
req.end(); 

Ответ приходит как объект JSON, но я получаю это в моем обратном вызове в массиве буфера и в нескольких кусках (мой обратный вызов вызывается несколько раз). Как узнать, когда все куски получены? И как тогда я могу преобразовать этот буфер массива в объект JSON?

+1

'res.on ('end', blah)' ?? – AdityaParab

+0

спасибо, предлагаете ли вы написать все данные на обратном вызове 'data' в какую-то переменную, а затем на обратный вызов' end'? Я делаю преобразование из буфера массива переменной в json? –

+1

Это было бы самым предпочтительным способом, если у вас нет требования, когда вы должны поместить кусок данных куском в stdout. :) Кроме того, хорошей практикой является использование функции обратного вызова в качестве параметра, а затем вызов этой функции обратного вызова в '.on ('end')' с полученными данными. – AdityaParab

ответ

2

Ответ на запрос в комментариях.

Первое, что нужно сделать, - это обернуть свой код в другую функцию.

function getHttpsData(callback){ // pass additional parameter as callback 
    var req = https.request(options, function (res) { 
     console.log('statusCode: ', res.statusCode); 
     console.log('headers: ', res.headers); 
     var response = ''; 

     res.on('data', function (d) { 
      // how to know when all chunks are received 
      //process.stdout.write(d); 
      response+=d; 
     }); 
     res.on('end', function(){ 
      var r = JSON.parse(response); 
      callback(r); // Call the callback so that the data is available outside. 
     }); 

    }); 
    req.end(); 
    req.on('error', function(){ 
     var r = {message:'Error'}; // you can even set the errors object as r. 
     callback(r); 
    }); 
} 

И затем вызвать функцию getHttpsData с callbackfunction в качестве параметра.

getHttpsData(function(data){ 
    console.log(data);//data will be whatever you have returned from .on('end') or .on('error') 
}); 
+0

Твердый ответ, хотя я бы рекомендовал либо: а) следовать за соглашением' node' о том, что у вас есть отдельные функции обратного вызова 'success' и' error', или я бы пропустил обратные вызовы и пошел с обещаниями. –

+0

@JeremyJStarcher: Спасибо! Я обновлю ответ, чтобы отразить это. :) – AdityaParab

Смежные вопросы