как получить чанки outputStream в режиме синхронизации? - PullRequest
0 голосов
/ 15 февраля 2019

есть ли способ преобразовать поток в буфер в режиме синхронизации?Мне нужно получить его как:

let newBuffer = outputStream.getDataSync();

вместо outputStream.on('data'..., как показано ниже

let newBuffer = convertStream(outputStream);

function convertStream(strm) {
  return new Promise((resolve, reject) => {
    const chunks = [];
    strm.on('data', (chunk) => {
      chunks.push(chunk);
    }).on('end', () => {
      resolve(Buffer.concat(chunks));
    }).on('error', (err) => {
      reject(err);
    });
  });
}

Я не могу использовать await для convertStream, потому что функция, из которой я вызываю его, не является асинхронной

Ответы [ 4 ]

0 голосов
/ 27 марта 2019

Как насчет использования потокового и асинхронного, но также и асинхронного итератора (for await)?

async function collectStream()
    let whole = [];
    for await (const chunk of outputStream) {
        whole.push(chunk);
    }
    return whole;
}

// another async function somewhere
async function main() {
    await collectStream();
}

Но что если вам действительно нужно сделать его асинхронным?Вы можете использовать deasync на collectStream().then.deasync.loopWhile может превратить обещание (асинхронную функцию) или обратный вызов в синхронизирующее.

Это нормально для приложения с одним арендатором, такого как инструменты CLI, но я не рекомендую его в мультитенантной системе, такой каквеб-сервер, так как вы можете заблокировать цикл событий.Вместо этого лучше использовать асинхронные функции на веб-серверах.

0 голосов
/ 15 февраля 2019

Поток - это поток данных.Вы не можете получить буфер синхронно, так как данные в потоке могут уже начать течь или когда-нибудь поступят.

Я не могу использовать await для convertStream, потому что функция, из которой я его вызываю, не является асинхронной

Тогда сделайте ту функцию, которую вы вызываете из async?

0 голосов
/ 15 февраля 2019

Говорят, что асинхронность заразна: как только в вашем потоке есть один асинхронный бит, весь зависимый поток должен быть асинхронным.Потоки по своей природе асинхронны, поэтому вы можете упростить свой код только с помощью синхронно выглядящего async-await.

Кстати, интерфейс асинхронного итератора для потоков может быть наиболее кратким способом сделать это.

0 голосов
/ 15 февраля 2019

Вы могли бы потенциально использовать await, заключив вызов в convertStream() в выражение немедленного вызова асинхронной функции .

function foo() {
  return Promise.resolve('bar');
}

(async function() { console.log(await foo()); })();
...