Отправить Promise для каждого фрагмента выбранных строк из nodeJS клиенту - PullRequest
0 голосов
/ 01 марта 2019

Я использую stream.pause () и stream.resume (), чтобы получить 10 тыс. Строк из mssql и отправить их, а затем возобновить процесс извлечения.Для отправки 10 тыс. Строк я выполняю обещание.Но отправляется только первая партия из 10 тыс. Строк.Дальнейшие строки не отправляются, поскольку они разрешаются один раз.Как использовать обещание для отправки строк каждый раз, когда поток приостановлен?Может ли кто-нибудь помочь мне в этом?Вот мой код.

return new Promise((resolve, reject)=>{
            var request = new sql.Request(dbConn);
            request.stream = true;
            console.log('query>>>>>>>>>>>')
            request.query(SPQuery);
            let rowsToProcess = [];
            request.on('row', row => {
                rowsToProcess.push(row);
                if (rowsToProcess.length === 10000) {

                    resolve(rowsToProcess)
                  request.pause();
                  processRows();
                }
              });
              request.on('done', () => {
                  processRows();
              });

              function processRows() {
                // process rows
                rowsToProcess = [];
                request.resume();
              } });

1 Ответ

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

Мое предложение будет заключаться в том, чтобы переместить метод «решить» в метод «запрос выполнен» после последних «обработанных строк» ​​и использовать обратный вызов для отчетов о ходе выполнения для каждого пакета строк.Затем вызывающий код может ожидать выполнения обещания, пока все не будет сделано, и функция обратного вызова вызывается между ними.Т.е.

queryAllRows = (onProgressCallback) => {

    return new Promise((resolve, reject)=>{
        var request = new sql.Request(dbConn);
        request.stream = true;
        console.log('query>>>>>>>>>>>')
        request.query(SPQuery);
        let rowsToProcess = [];
        request.on('row', row => {
            rowsToProcess.push(row);
            if (rowsToProcess.length === 10000) {

              request.pause();
              onProgressCallback(rowsToProcess); // <---- callback here
              processRows();
            }
          });
          request.on('done', () => {
              processRows();
              resolve(); // <---- resolve here
          });

          function processRows() {
            // process rows
            rowsToProcess = [];
            request.resume();
          } });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...