首页 > 解决方案 > Promise 并不总是从 Web 服务中获取所有值

问题描述

this.batGradesProvider.getAllCourseIds()我正在使用我创建的多个 Web 服务 ( && provider.getCoursesGrades)使用承诺来填充数组,但我并不总是从我的 Web 服务中获取所有值。例如,对于我的一个测试用例,我知道我有一组 6 个课程成绩,但最后我只收到 2 个。我的承诺或 forEach 是否做错了什么?提前致谢。

const promise = this.batGradesProvider.getAllCourseIds();

    promise.then((courseIds) => {

        courseIds.forEach((courseId) => {

            const promise2 = provider.getCoursesGrades(siteId, courseId, userid);
            promise2.then((data) => {

                for (let i = 0; i < data.data.length; i++) {
                    // Get this course
                    const activity = data.data[i];

                    const activityObj: Activity = {
                        courseName: activity.courseName,
                        courseId: courseId,
                        name: activity.name,
                        status: activity.status,
                        complete: activity.complete,
                        score: activity.grade,
                        hasPassed: activity.hasPassed,
                        user: activity.username,
                        email: activity.useremail,
                        activityName: activity.activityname,
                        activityId: activity.activityid
                    };
                    // Add course to our running data
                    this.batGradesTable.push(activityObj);
                }

                return this.batGradesTable;
            });
        });
    })

标签: javascripttypescriptes6-promise

解决方案


您正在尝试在 a 中执行承诺forEach,但 forEach 函数不知道它应该等待承诺完成。Promise.all当你想要执行许多 Promise 时,你可能想熟悉一下。

尝试这样的事情:

this.batGradesProvider.getAllCourseIds().then((courseIds) => {
  return Promise.all(courseIds.map((courseId) => {
    return provider.getCoursesGrades(siteId, courseId, userid);
  }).then((results) => {
    this.batGradesTable = [];

    results.forEach((data) => {
      for (let i = 0; i < data.data.length; i++) {
        const activity = data.data[i];
        const activityObj = { /* ... */ };
        this.batGradesTable.push(activityObject);
      }
    });

    return this.batGradesTable;
  });
});

推荐阅读