我使用服务(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
};
}
}
答案 0 :(得分:0)
也许使用类似以下的模式
step1().switchMap(res=>{
if(res.nextRecordsUrl)
return step2().repeat().takeWhile(v=>res.nextRecordsUrl)
return Observable.of(res)
}).subscribe()
&#13;