Список курсов и их учеников, использующих Goggle Classroom API - PullRequest
0 голосов
/ 07 мая 2019

Я недавно использую Google Classroom API и пытаюсь получить список курсов и их учеников:

Курс 1:

студенты: студент 1.1 студент 1.2 студент 1.3

Курс 2:

студенты: студент 2.1 студент 2.2 студент 2.3 студент 2.3 студент 2.4

...

Но мой код получает:

Курс 1: Курс 2:

ученики: ученик 1.1 ученик 1.2 ученик 1.3

ученики: ученик 2.1 ученик 2.2 ученик 2.3 ученик 2.4

Знаете ли вы, почему?

    function listCourses() {
      gapi.client.classroom.courses.list({
        pageSize: 10,
      }).then(function(response) {
        var courses = response.result.courses;
        appendPre('Courses:');
        if (courses.length > 0) {
          for (i = 0; i < courses.length; i++) {
            var course = courses[i];
            appendPre(course.name+":"+course.id)
            listStudents(course.id);
          }
        } else {
          appendPre('No courses found.');
        }
      });
    }

    function listStudents(c) {
      gapi.client.classroom.courses.students.list({
        courseId: c
      }).then(function(response) {
        console.log(response.result);
        var students = response.result.students;
        appendPre('students:');
        if (students.length > 0) {
          for (i = 0; i < students.length; i++) {
            var student = students[i];
            appendPre(c+":"+student.userId+":"+student.profile.name.fullName)
          }
        } else {
          appendPre('No students found.');
        }
      });
    }

1 Ответ

0 голосов
/ 06 июня 2019

Поскольку оба вызова к конечным точкам gapi.client.classroom.courses.list и classroom.courses.students.list являются асинхронными, вы заканчиваете тем, что получаете ответ от своего запроса courses.list, а затем выполняете итерацию по каждому полученному курсу.Однако внутри вашего цикла for вы отправляете запрос на перечисление студентов для данного курса, но не ожидаете ответа, поэтому обещание создается, но ваш цикл for не ждет ответа, прежде чем двигаться дальше.для обработки следующего курса.

По сути, вам нужно думать обо всем, что находится внутри вашей функции .then(, как об отдельном процессе, который в конечном итоге будет выполняться, но не будет блокировать выполнение вашего кода.Возврат объекта из ваших вызовов на gapi.client возвращает goog.Thenable, который может быть обработан как любое другое обещание.

В зависимости от среды, в которой вы строите, выВы можете захотеть использовать async await ( читать об этом здесь ) или библиотеку Promise ( Мне нравится Bluebird ) для обработки этих блоков асинхронного кода блокирующим образом.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...