使用Goggle课堂API的课程及其学生的列表

时间:2019-05-07 07:04:50

标签: javascript google-api google-classroom

我是使用Google Classroom API的新手,我正试图获取课程列表以及像这样的学生:

课程1:

学生: 学生1.1 学生1.2 学生1.3

课程2:

学生: 学生2.1 学生2.2 学生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 :(得分:0)

由于对gapi.client.classroom.courses.listclassroom.courses.students.list端点的调用都是异步的,因此您最终将获得来自courses.list请求的响应,然后遍历检索到的每个课程。但是,在您的for循环中,您正在发送请求以列出给定课程的学生,但没有等待响应,因此创建了Promise,但是您的for循环之前没有等待响应继续进行下一门课程。

本质上,您需要将.then(函数中的所有内容视为一个单独的过程,该过程最终将运行,但不会阻止代码执行。您对gapi.client的调用返回的对象将返回goog.Thenable,可以像处理其他任何promise一样进行处理。

根据您所构建的环境,您可能想要使用async awaitread about it here)或Promise库(I like bluebird)来处理这些异步操作代码块以阻塞的方式。

您还需要确保您正在处理学生端点上的分页,因为每个班级最多可以容纳1000名学生,并且您可能会遇到结果一页以上的班级。