Javascript 什么';当一个步骤的输入是前一个步骤的输出时,是链接数据处理步骤的更好方法吗?
基本上,脚本需要从服务器获取课程和参与者(学生+讲师)信息,然后根据新的分组请求重新分配参与者 事情是这样开始的:Javascript 什么';当一个步骤的输入是前一个步骤的输出时,是链接数据处理步骤的更好方法吗?,javascript,fetch,moodle,Javascript,Fetch,Moodle,基本上,脚本需要从服务器获取课程和参与者(学生+讲师)信息,然后根据新的分组请求重新分配参与者 事情是这样开始的: fetch(fetchAddress) .then (function (response) { return response.json(); }) .then(function (data) { appendCoursesData(data); }) .catch(function (err) {
fetch(fetchAddress)
.then (function (response) {
return response.json();
})
.then(function (data) {
appendCoursesData(data);
})
.catch(function (err) {
console.log(err);
})
getRelevantCourses();
getEnrolledUsers(siteAddress, token);
fetch(fetchAddress)
.then (function (response) {
return response.json();
})
.then(function (data) {
appendUserData(data, courseName);
})
.then(function () {
distributeParticipants();
})
.catch(function (err) {
console.log(err);
})
getRelevantCourses()
需要获取步骤中的数据,getEnrolledUsers()
需要getRelevantCourses()步骤中的数据
我很快意识到这是行不通的,因为JavaScript并不是逐行处理的。因此,它扩展到:
fetch(fetchAddress)
.then (function (response) {
return response.json();
})
.then(function (data) {
appendCoursesData(data);
})
.then(function () {
getRelevantCourses();
})
.then(function () {
getEnrolledUsers(siteAddress, token);
})
.catch(function (err) {
console.log(err);
})
然后,在getEnrolledUsers()
中,我最终需要这样的东西:
fetch(fetchAddress)
.then (function (response) {
return response.json();
})
.then(function (data) {
appendCoursesData(data);
})
.catch(function (err) {
console.log(err);
})
getRelevantCourses();
getEnrolledUsers(siteAddress, token);
fetch(fetchAddress)
.then (function (response) {
return response.json();
})
.then(function (data) {
appendUserData(data, courseName);
})
.then(function () {
distributeParticipants();
})
.catch(function (err) {
console.log(err);
})
现在,逻辑几乎全搞乱了
等待时间不好。我也尝试了async/wait
,但也没有成功。(尽管如此,很可能是因为我写错了,所以它没有正常工作。)
这就是它所做的:
- 第一个
fetch
从服务器获取课程数据
appendCoursesData()
将提取中的所有数据放入数组中
getRelevantCourses()
从上一个数组中获取用户所需的所有课程的课程信息
getEnrolledUsers()
获取注册相关课程的用户的信息
appendUserData()
选择已注册用户列表中的相关用户数据。完整列表中的每一行都有比所需更多的信息,因此此函数只提取数据中所需的部分
distributeParticipants()
将用户重新分组,这是脚本的总体目标
有什么更好的方法可以做到这一点
附加信息:我正在使用Moodle的Web服务API
谢谢。如果三个顺序函数也是服务器调用,并且传输时间占用了大部分计算,那么最好定义一个自定义端点,将所有计算合并为一个端点
处理仍然需要按顺序进行,但都将在服务器上通过一个http调用而不是三个http调用执行。比如:
fetch(customCombinedFetchEndpointUrl).then(function(response){
var json_response=response.json();
var courses= json_response.courses
var users= json_response.users
})
在服务器上,它执行函数处理并立即返回。以下是一些伪服务器代码:
route("/customCombinedFetchEndpointUrl", inputs){
course_data=getRelevantCoursesServer(inputs);
user_data=getEnrolledUsersServer(course_data);
return {course_data,user_data}
}
为什么不尝试使用async/await呢
async function a(){
return 1
}
async function b(value1){
return value1+2
}
const value1= await a()
const result= await b(value1)
为什么要将每个函数包装成自己的。然后()
?它不就是fetch(…);附录课程数据(…);获取相关课程();获取注册用户(…)代码>查看async
/wait
不管怎样,如果此代码太长,则可能位于服务器端或appendUserData
或distributedparticipants
函数中。在这个@Andreas中没有看到它,我将它们包装起来,以便它们等待前一行完成。当它们在fetch之外时,它们是独立运行的,因此它们没有数据,因此没有任何工作。把他们锁在围栏里一直到不行。我尝试了异步/等待路由,但没有成功。当然,我可能只是误用了它。(我应该把它添加到原来的帖子中。)对于一个实际的答案,你必须添加你正在使用的函数-至少解释它们的作用和返回的内容(aPromise
?)->我看不出如何将URL的功能组合起来。为了能够获取用户数据,您需要在第一次获取中收集的课程ID。此外,我无法写入服务器端代码,因为访问。另外,我们专门开发Moodle的API。我应该在原来的帖子中加上这一点。这是一个展示async
/await
如何工作的糟糕例子。对于这个问题,我并不是真正的答案。@Andreas的想法并不是要解释async/await是如何工作的!!该示例的目的是展示一种更好的方法来处理多个承诺,而不是所有嵌套的。然后
您的示例在没有async
/await
的情况下可以完美地工作-这如何显示async
/await
以及如何使用OPs脚本?是的,我知道它在没有async/await的情况下工作,我不会返回任何承诺,因此没有理由等待函数,但正如我前面所说的,这是一个示例,不是一个解决方案/实现