【发布时间】: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