Поскольку оба вызова к конечным точкам gapi.client.classroom.courses.list
и classroom.courses.students.list
являются асинхронными, вы заканчиваете тем, что получаете ответ от своего запроса courses.list, а затем выполняете итерацию по каждому полученному курсу.Однако внутри вашего цикла for
вы отправляете запрос на перечисление студентов для данного курса, но не ожидаете ответа, поэтому обещание создается, но ваш цикл for не ждет ответа, прежде чем двигаться дальше.для обработки следующего курса.
По сути, вам нужно думать обо всем, что находится внутри вашей функции .then(
, как об отдельном процессе, который в конечном итоге будет выполняться, но не будет блокировать выполнение вашего кода.Возврат объекта из ваших вызовов на gapi.client
возвращает goog.Thenable
, который может быть обработан как любое другое обещание.
В зависимости от среды, в которой вы строите, выВы можете захотеть использовать async await
( читать об этом здесь ) или библиотеку Promise ( Мне нравится Bluebird ) для обработки этих блоков асинхронного кода блокирующим образом.
Вам также необходимо убедиться, что вы обрабатываете разбиение на страницы на конечной точке учащихся, поскольку в классах может быть до 1000 учащихся, и вы, скорее всего, столкнетесь с классами, которые имеют более одной страницы результатов.