一种 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; //返回数据
      });
    });
  }
Top