递归调用Observable并返回响应

时间:2017-10-08 19:22:49

标签: angular rxjs observable angular2-services

我使用服务(force.ts)在我的angular2应用中执行CRUD操作。 Service的API返回一个promise,它在DataService中被转换为Observable(内部服务被编写为与ForceService进行通信/修改数据)。

如果记录超过2,000或响应大小较大,Salesforce RestAPI服务会自动发送较少的记录,并发送nextRecordsUrl属性以获取下一批记录。

当我从DataService获取记录时,我想逐渐更新视图。我试过但结果没有正确地正确返回。

这是预期的流程:

1:致电 getAccounts()

2:返回结果,更新视图

2.1:如果 nextRecordsUrl 存在,请致电 getNextBatchOfAccounts()

2.1.1:从第2步重复

这是我尝试过的代码:

import { Injectable } from '@angular/core';
import { ForceService } from '../force';
import { Observable } from 'rxjs/Observable';

@Injectable()
export class DataService {


    getAccounts() {
        let promise =  this.force.query(
           'SELECT Id,Name FROM Account'


        let self = this;

        return Observable.fromPromise(promise).map(result => {
            let data = (<any>result).records;

            if(result.nextRecordsUrl) {
                return getNextBatchOfAccounts(result.nextRecordsUrl.slice(27));
            }
            else {
                return data.map(function(record) {
                    return self._convertToCustomType(record);
                })
            }

        });
    }

    getNextBatchOfAccounts(queryId) {
        let promise =  this.force.getNextUrlRecords(
           queryId
        );

        return Observable.fromPromise(promise).map(result => {
            let data = (<any>result).records;

            if(result.nextRecordsUrl) {
                return getNextBatchOfAccounts(result.nextRecordsUrl.slice(27));
            } else {
                return data.map(function(record) {
                    return self._convertToCustomType(record);
                })
            }

        });

    }

    _convertToCustomType(item:any) {
        return {
            'label' : item.Name,
            'value' : item.Id
        };
    }
} 

1 个答案:

答案 0 :(得分:0)

也许使用类似以下的模式

&#13;
&#13;
 step1().switchMap(res=>{
  if(res.nextRecordsUrl) 
    return step2().repeat().takeWhile(v=>res.nextRecordsUrl)
  return Observable.of(res)
}).subscribe()
&#13;
&#13;
&#13;