【问题标题】:Recursively call Observable and return response递归调用 Observable 并返回响应
【发布时间】:2018-03-19 23:54:12
【问题描述】:

我正在使用服务 (force.ts) 在我的 angular2 应用程序中执行 CRUD 操作。 Service 的 API 返回一个 Promise,该 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
        };
    }
} 

【问题讨论】:

  • @OlesSavluk 您的解决方案对我有用。非常感谢。我有一个问题,关于 Observable 的订阅者如何一一获取记录。在我的情况下,API 返回一个对象数组,但是订阅者以某种方式一个接一个地获取对象(看起来它正在被迭代并且它正在调用订阅者的回调)?
  • Observable.fromArray(items);完成。您可以将其替换为 .of 以获取数组流

标签: angular rxjs observable angular2-services


【解决方案1】:

也许使用如下模式

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-09
    • 1970-01-01
    • 1970-01-01
    • 2017-08-20
    相关资源
    最近更新 更多