从ORM返回的Promise序列生成RxJS Observable

时间:2016-01-06 08:32:49

标签: javascript promise reactive-programming observable rxjs

我试图从SQL数据库的一系列(批处理)记录中generate Observable,我试图浏览数据库中的所有记录。我在node-js上使用ORM,Sequelize返回包含在promise中的记录。

我已经定义了一个函数fetchbatch(),该函数提取下一批并将结果Promise[Array[Record]]flatMap返回给Observable

根据查询是否返回没有记录,我的条件(终止)被设置为promise的then块中的全局,但是永远不会调用回调,只会无限地返回promise,因此永远不会满足终止条件。有关如何处理的任何建议?这是代码的要点。

 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)

0 个答案:

没有答案