Обещание не всегда получает все значения из веб-сервиса - PullRequest
0 голосов
/ 16 января 2019

Я использую обещания для заполнения массива, используя несколько созданных мной веб-сервисов (this.batGradesProvider.getAllCourseIds() && provider.getCoursesGrades) , но я не всегда получаю ВСЕ значения из моего веб-сервиса. Например, для одного из моих тестовых случаев я ЗНАЮ, что у меня есть массив из 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;
            });
        });
    })

1 Ответ

0 голосов
/ 16 января 2019

Вы пытаетесь выполнить обещание в пределах forEach, но функция forEach не знает, что должна ждать выполнения обещания. Возможно, вы захотите познакомиться с Promise.all, если хотите выполнить много обещаний.

Попробуйте что-то вроде этого:

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;
  });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...