Javascript 从ORM返回的承诺序列生成一个可观察的RxJS

Javascript 从ORM返回的承诺序列生成一个可观察的RxJS,javascript,promise,reactive-programming,observable,rxjs,Javascript,Promise,Reactive Programming,Observable,Rxjs,我试图从SQL数据库中的一系列(批处理)记录中生成一个可观察的,我试图遍历数据库中的所有记录。我在节点js上使用ORM,Sequelize,它返回封装在承诺中的记录 我已经定义了一个函数fetchbatch(),它获取下一批,并返回一个Promise[Array[Record]]和flatMap,将结果转换为一个可观察的 根据查询是否未返回任何记录,我的条件(终止)在承诺的then块中设置为全局条件,但从不调用回调,只无限返回承诺,因此永远不会满足终止条件。对如何处理这一问题有何建议?下面是代码

我试图从SQL数据库中的一系列(批处理)记录中
生成一个
可观察的
,我试图遍历数据库中的所有记录。我在节点js上使用ORM,
Sequelize
,它返回封装在承诺中的记录

我已经定义了一个函数
fetchbatch()
,它获取下一批,并返回一个
Promise[Array[Record]]
flatMap
,将结果转换为一个
可观察的

根据查询是否未返回任何记录,我的条件(终止)在承诺的then块中设置为全局条件,但从不调用回调,只无限返回承诺,因此永远不会满足终止条件。对如何处理这一问题有何建议?下面是代码的要点

 function getAllPaginated(conditions) {
    var remaining = true;
    var batch_size = 20;
    function condition(){ return remaining; }
    function selector(promisedBatchOfRecords){
      //console.log(promisedBatchOfRecords);
      //return Observable.fromPromise(promisedBatchOfRecords[1]);
      return (promisedBatchOfRecords[1]);
    }
    function fetchBatch(batchNumberAndBatch) { // Returns [NextBatchNumber, Promise[Array[Record]]]
      //console.log(remaining);
      var batch_number = batchNumberAndBatch[0];
      var offset = (batch_number - 1) * batch_size;
      var rs = Records.findAll({where: conditions, offset: offset, limit: batch_size});
      return [batch_number + 1,
              rs.then(function(batch) {
                console.log(batch.length);
                if (!(batch.length > 0)){
                  remaining = false;
                };
                return batch.map(function(r){r.dataValues});
              })];
    }
    return Observable.generate(fetchBatch([1, []]), condition, fetchBatch).flatMap(Ramda.identity/*over the promise*/).flatMap(Ramda.identity/*over the list*/);
  }
var o = getAllPaginated({where: {a: "b"}})
o.subScribeOnNext(console.log)

您可以尝试类似的方法:

const result=新接收对象;
常量批次大小=3;
//初始化递归
whileFind(0)
.subscribe();
//在这里获取结果
结果
.mergeAll()
.map(batch=>batch.dataValues)
.subscribe(值=>console.log(值));
//递归函数
函数whileFind(偏移量){
从承诺返回可观察的Rx(findAll(偏移))
.concatMap(批处理=>{

if(batch.length
返回batch.map(函数(r){r.dataValues})
这只是将所有值映射为未定义值。您缺少一个返回值或一个
r=>r.dataValues
。由于Sequelize使用bluebird,您可以使用
Promise.map
,这更简单。感谢@BenjaminGruenbaum,刚刚从Scala进入JS世界,您还知道有什么方法可以
生成
/
创建一个Obs吗每次执行一个函数就可以观察到吗?您只需执行
newobservable
并将源代码传递到构造函数中即可。