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之外时,它们是独立运行的,因此它们没有数据,因此没有任何工作。把他们锁在围栏里一直到不行。我尝试了异步/等待路由,但没有成功。当然,我可能只是误用了它。(我应该把它添加到原来的帖子中。)对于一个实际的答案,你必须添加你正在使用的函数-至少解释它们的作用和返回的内容(a
Promise
?)->我看不出如何将URL的功能组合起来。为了能够获取用户数据,您需要在第一次获取中收集的课程ID。此外,我无法写入服务器端代码,因为访问。另外,我们专门开发Moodle的API。我应该在原来的帖子中加上这一点。这是一个展示
async
/
await
如何工作的糟糕例子。对于这个问题,我并不是真正的答案。@Andreas的想法并不是要解释async/await是如何工作的!!该示例的目的是展示一种更好的方法来处理多个承诺,而不是所有嵌套的
。然后
您的示例在没有
async
/
await
的情况下可以完美地工作-这如何显示
async
/
await
以及如何使用OPs脚本?是的,我知道它在没有async/await的情况下工作,我不会返回任何承诺,因此没有理由等待函数,但正如我前面所说的,这是一个示例,不是一个解决方案/实现