Node.js在.then链中重复数据库请求

时间:2017-11-13 13:16:01

标签: javascript node.js promise request repeat

我使用了一个承诺.then链。在这个链中,我计算了一些边界,构建了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);
    }
  })

while循环并不是一个好主意,她最终会因为#34;内存不足而导致#34;。

这样做会有什么更好的解决方案?

1 个答案:

答案 0 :(得分:1)

使用dummyRecursiveFunction作为参数创建一个函数addToOffset并调用它,直到您在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);
    }
  });
}