我是使用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.');
}
});
}
答案 0 :(得分:0)
由于对gapi.client.classroom.courses.list
和classroom.courses.students.list
端点的调用都是异步的,因此您最终将获得来自courses.list请求的响应,然后遍历检索到的每个课程。但是,在您的for
循环中,您正在发送请求以列出给定课程的学生,但没有等待响应,因此创建了Promise,但是您的for循环之前没有等待响应继续进行下一门课程。
本质上,您需要将.then(
函数中的所有内容视为一个单独的过程,该过程最终将运行,但不会阻止代码执行。您对gapi.client
的调用返回的对象将返回goog.Thenable
,可以像处理其他任何promise一样进行处理。
根据您所构建的环境,您可能想要使用async await
(read about it here)或Promise库(I like bluebird)来处理这些异步操作代码块以阻塞的方式。
您还需要确保您正在处理学生端点上的分页,因为每个班级最多可以容纳1000名学生,并且您可能会遇到结果一页以上的班级。