我正在使用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();
} });
我的建议是在最后一个'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();
} });
}