一种 Promise 的实现模式
2017 年 05 月 24 日
使用Angular 2去获取远端数据源的时候,使用的是Promise。
当远端数据源是Spring Data Rest的时候,每次请求返回的是一页,但页数是根据数据总量和页大小来决定的。
在这种情况下,传统的做法是递归,不断去获取下一页并合并,直到无下一页可取。
但在Promise这种实现方式下,递归是不适合的,有一种更适合的做法,就是Promise.all,具体说来,实现模式是这样的:
graph TB
Start[获得第0页的Promise] --> A[保留第0页数据]
A --> B[生成剩余页的所有Promise]
B --> C[执行Promise.all]
C --> D[合并所有数据]
D --> End[返回数据]
一段例子代码如下:
getAllTeachers(): Promise<Teacher[]> {
return this.getTeachersPage(0).then(teachersPage0 => { //获得第0页的Promise
this.tempTeacherPage = teachersPage0; //保留第0页数据
if (teachersPage0.page.totalPages === 1)
return teachersPage0.embedded.teachers;
let promises = [];
for (var index = 0; index < (teachersPage0.page.totalPages-1); index++) {
promises[index] = this.getTeachersPage(index+1);
} //生成剩余页的所有Promise
return Promise.all(promises).then(results => { //执行Promise.all
results.forEach((item, index) => {
console.log("item="+JSON.stringify(item));
this.tempTeacherPage.embedded.teacher = this.tempTeacherPage.embedded.teacher.concat(item.embedded.teacher);
}); //合并所有数据
return this.tempTeacherPage.embedded.teacher; //返回数据
});
});
}