JavaScript异步/等待
#javascript #编程 #codenewbie #asynchronous

在本文中,我将继续讨论异步代码,更具体地说是如何使用async/等待。

在进行进一步之前,如果我想让您从本文中夺走一件事是:归根结底,异步/等待我们可以同步编写异步代码,而不是无尽的嵌套回调。

主要要点

1.当我们使用异步/等待时,等待始终等到承诺解决。

2.我们只能在功能前有异步时使用等待,这很重要,因为大多数情况下,一旦人们学习异步/等待初学者,他们几乎开始在他们的代码上等待着,您可以不那样做。您只能在设置的功能实际上是异步的情况下等待。

3.ASYNC函数总是返回承诺。

n.b :在本文中,我将使用箭头功能,但是如果您更喜欢使用传统功能,就不会对您进行法律。

一般示例

//展示Async函数将始终返回Promise

const example = async ()=> {
    return "Hello world"
}
console.log(example()) // it will show a promise in the console.

输出:
Image 1
如您所见,这是一个承诺,它立即实现。请记住,异步将永远并始终回报诺言。

//展示如何等待工作:

const example = async () =>{
    return "Hello world";
}
const someFunc = async () =>{
    const result = await example();
    console.log(result);
}
someFunc();

输出:
Image 2
从这里开始,等待需要等到示例函数的承诺解决,然后您可以将结果在控制台中获取。这非常重要,因为您不必使用。

现实世界示例:

通常,您通常会在电线上请求资源,含义来自数据库,API或其他任何内容,但在这里我将使用一个简单的示例,其中我有一个用户数组(包含学生)和类数组(包含受试者) )学生正在服用。

const users = [ // array of objects containing stundets and their ID
    {id: 1, name:"kebean"},
    {id: 2, name:"Chico"},
    {id:3, name:"Maelle"},
]
const classes = [ // array of objects containing student ID and classes they are taking
    {studentId:1, classesTaken:["OOP", "C", ".Net"]}, //kebean take this class because the ID matches 
    {studentId:2, classesTaken:["Math", "History"]}, //Chico take this class because the ID mathches
    {studentId:3, classesTaken:["Physics", "Chemistry", "Geography"]} //Maelle take this class because the ID mathches
]

const getUser = (name) =>{
    return new Promise((resolve, reject) =>{
        const user = users.find((user) => user.name ===name);
        if (user){
            return resolve(user);
        }else{
            reject(`No such user with name: ${name}`);
        }
    })
}

const getClasses = studentId => {
    return new Promise((resolve, reject) =>{
        const userClasses = classes.find((user) => user.studentId === studentId)
        if(userClasses){
            return resolve(userClasses.classesTaken)
        }else{
            reject("Wrong ID")
        }
    })
}

n.b :您需要了解上述功能是按顺序进行的,只有一旦获得学生,只有这样您才能访问他们正在学习

的主题

由于您熟悉以上两个功能,我想展示如何使用典型的.then()方法获取数据,然后我将展示如何在使用async/等待的同时可以实现同一件事至少在我的角度,更有效和可读。

典型的.then()方法

getUser("kebean") // returns a promise
.then((user) => console.log(user)) //you will have access to data you pass into resolve()
.catch((error) => console.log(error)) //when there is errors, you will catch them here

逻辑是以下内容:如果名称匹配,您当然会获取学生,当名称不匹配时,您将获得错误消息。
输出:

Image 3

当用户不存在时:

getUser("kebeans") 
.then((user) => console.log(user)) 
.catch((error) => console.log(error)) 

您可以看到,错误消息将显示
输出:
Image 4

getUser("kebean") 
.then((user) => getClasses(user.id)) //invoking getClasses and pass in the user ID
.then((classes) => console.log(classes)) //the getClasses function above, returns classes that match to the user ID or student ID you passed in
.catch((error) => console.log(error)) 

输出:
Image 4

上述设置的问题是,一旦您进行了多个异步操作,您就必须开始链接这些。然后是不可读取且漫长的写作。这是异步/等待的地方真正发光的地方,因为您可以通过重构代码使用异步/等待的代码来使上述代码更易读。

异步/等待方法

const getStudent = async () =>{
    const user = await getUser("kebean") 
    console.log(user)
}
getStudent()

输出:
Image 5

从上面的示例中,您可以看到可以使用异步/等待学生访问学生。还让我们看看如何访问学生真正可以上课。

const getStudent = async () =>{
    const user = await getUser("kebean");
    if(user){
        const classes = await getClasses(user.id);
        console.log(classes)
    }
}
getStudent()

输出:
Image 6

繁荣!您可以上课也可以参加。

只要在这两种方法中查看代码,我的意思是,即使代码几乎做同样的事情,您也可以清楚地看到使用Async/等待的方法更可读性和简短。

在使用异步/等待时如何处理错误

您可以看到,在使用异步/等待时,无法按预期处理错误。查看以下代码:

const getStudent = async () =>{
    const user = await getUser("kebeans");
    if(user){
        const classes = await getClasses(user.id);
        console.log(classes)
    }
}
getStudent()

输出:
Image 7
如您所见,学生(用户)“ kebeans”(最后是“ s”)不存在,而不是在recept()中定义错误消息,而是在控制台中变得凌乱,并且需要什么是为了优雅地处理。您可以通过设置尝试并捕获这样的块来做到这一点:

const getStudent = async () =>{
    try {
        const user = await getUser("kebeans");
        if(user){
            const classes = await getClasses(user.id);
            console.log(classes)
        }
    } catch (error) {
        console.log(error)
    }
}
getStudent()

输出:

Image 8

结论

希望,现在您可以清楚地看到为什么在我们需要处理异步任务时,异步/等待的原因几乎成为了。

它通过允许我们以更同步的样式编写异步代码来提高可读性,从而易于阅读和理解。这对于刚出现异步编程的开发人员也可能特别有用。

感谢您的阅读和快乐的编码!

kebean。