Как мне дождаться завершения функции (toString ()), прежде чем использовать эту переменную? - PullRequest
1 голос
/ 10 октября 2019

Я пытаюсь преобразовать буфер в строку и пытаюсь разобрать его в Json. Но иногда он пытается преобразовать в Json до завершения строковой операции.

В приведенном ниже коде я пытался преобразовать данные буфера, находящиеся в переменной dat, в строку и проанализировать их в JSON. Поэтому иногда JSON.parse выдает ошибку (неполный формат json для разбора).

var apicall = {
    url: API,
    method: 'post',
    responseType: 'stream',
    headers: {
        'Content-Type': 'application/json',
    },
    data: body
}
axios(apicall).then((res) =>{
   var writer = new MemoryStream(null, {
       readable : true
   })
   res.data.pipe(writer)
   writer.on('data',function(dat){  
       console.log(dat);
       var e = dat.toString();
       var jsondata = JSON.parse(e);
       console.log(jsondata);
   });
}).catch((e)=>{
    console.log(e);
})

Попросите кого-нибудь помочь мне, как дождаться завершения функции toString

1 Ответ

0 голосов
/ 10 октября 2019

Проблема с этим подходом состоит в том, что вы получите ответ в чанках, значение по умолчанию составляет 16 КБ, поэтому, если у вас есть json больше, чем это, оно будет входить в несколько чанков.

Один способИсправьте ваш алгоритм, чтобы сохранить все эти чанки в отдельный массив и после завершения потока end событие проанализировать его:

let body = [];
writer.on('data', (chunk) => {
  body.push(chunk);
}).on('end', () => {
  body = Buffer.concat(body).toString();
  // at this point, `body` has all the chunks stored in as a string
  // here you will be able to JSON.parse the body
  const json = JSON.parse(body);
});

Недостатком подхода являетсячто он не будет работать с очень большими файлами, размер которых превышает 1,7 ГБ, поскольку они не помещаются в память.

...