Javascript Node.js在中重复数据库请求,然后链接

Javascript Node.js在中重复数据库请求,然后链接,javascript,node.js,promise,request,repeat,Javascript,Node.js,Promise,Request,Repeat,我使用承诺。然后链。在这个链中,我计算一些界限,构建sql语句并向数据库发送请求。如果数据库请求没有给出结果,我希望通过计算边界来更改某些内容,并再次执行相同的步骤。我想重复这个过程,直到有一个数据库结果 这是我的代码: .then(function(){ return calcBound.calcBounds(req.body,0); }) .then(function(options){ return sqlStatementBuilder.sqlStatementB

我使用承诺
。然后
链。在这个链中,我计算一些界限,构建sql语句并向数据库发送请求。如果数据库请求没有给出结果,我希望通过计算边界来更改某些内容,并再次执行相同的步骤。我想重复这个过程,直到有一个数据库结果

这是我的代码:

.then(function(){
    return calcBound.calcBounds(req.body,0);
  })
  .then(function(options){
    return sqlStatementBuilder.sqlStatementBuilder(options);
  })
  .then(function(statement){
    return db_request.db_request(statement);
  })
  .then(function(dbResult){
    if(dbResult.length <= 0){ // if there are no results from the database
      console.log("There are no results for this filter options");
      var newDBResult;
      do{
        newDBResult = calcBound.calcBounds(req.body, addToOffset)              
                .then(function(options){
                  return sqlStatementBuilder.sqlStatementBuilder(options);
                })
                .then(function(statement){
                  return db_request.db_request(statement);
                })
      } while(dbResult.length <= 0);
      return newDBResult.sort(sortArray.compareRecordId);
    }else{
      return dbResult.sort(sortArray.compareRecordId);
    }
  })
.then(函数(){
返回calcBound.calcBounds(请求主体,0);
})
.然后(功能(选项){
返回sqlStatementBuilder.sqlStatementBuilder(选项);
})
.then(函数(语句){
返回db_request.db_request(语句);
})
.then(函数(dbResult){

if(dbResult.length使用
addToOffset
作为参数创建一个函数
dummyRecursiveFunction
,并调用它直到在
dbResult

function dummyRecursiveFunction(addToOffset) {
  someFunction()
  .then(function(){
    return calcBound.calcBounds(req.body, addToOffset);
  })
  .then(function(options){
    return sqlStatementBuilder.sqlStatementBuilder(options);
  })
  .then(function(statement){
    return db_request.db_request(statement);
  })
  .then(function(dbResult) {
    if(dbResult.length > 0) {
      return dbResult.sort(sortArray.compareRecordId);
    } else {
      // newOffset: Your recalculated offset value.
      dummyRecursiveFunction(newOffset);
    }
  });
}

如果不是while循环,那么您需要一个
max\u trys
…否则,while循环中的函数为什么会导致内存堆不足?其他可能会出错…递归调用函数。将递归函数与
addToOffset
记录为变量参数将在此场景。在循环中,重复调用calcBounds(),而无需等待承诺解析(或设置dbResult),因此这里有一个无休止的循环。需要再次调用承诺链,递归并引入“addToOffset”参数,如果没有找到结果-以及一个合理的中止条件。是否有可能设置
max\u trys
?当然,您可以使用一个变量,比如
var max\u trys=1000;
,然后将参数
numberoftrys
添加到函数
dummyRecursiveFunction(numberOfTries,addToOffset)
。每次调用时,递增
numberofthries
的值。此外,在运行函数之前,请选中
numberofthries