从nodeJS到Client的每个获取行的发送Promise

问题描述 投票:0回答:1

我正在使用stream.pause()和stream.resume()从mssql中获取10k行并发送它们然后恢复获取进程。为了发送10k行,我正在解决这个问题。但是只发送了第一批10k行。不会发送更多行,因为它已解析一次。如何使用promise在每次流暂停时发送行?有人可以帮我吗?这是我的代码。

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();
              } });
node.js sql-server stored-procedures promise stream
1个回答
0
投票

我的建议是在最后一个'processRows'之后将'resolve'移动到'request done'方法中,并为每批行的进度报告使用回调。然后调用代码可以等待promise,直到完成所有操作并在中间调用回调函数。即

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();
          } });
}
© www.soinside.com 2019 - 2024. All rights reserved.