之前刚刚开始接触node.js的时候就看了一段视频讲同步异步的,看得一头雾水,对这几个单词充满了疑问,看别的视频的时候看到别人新手敲进去,也不知道是为了什么,这两天才好好地研究了一下。

不得不说选择视频真的是太重要了,同样的人来讲解一个事情,有些人讲了听得明白,有些人讲了也还是听不明白,有些人只需要讲10分钟,有些人讲了40分钟,也不一定是视频的人讲得不好,每个人的学习都要依靠自己目前的知识体系,只有能和自己的知识网络联系起来,才可能学得会。

这次就是在Youtube上学的,一个叫Hitesh Choudhary的印度老哥讲的,视频只有12分钟,不过还是听明白了,下面讲一下的自己的理解。

以下正文开始

Promise,async和await一般是在请求资源的时候使用,因为请求资源的时候,对方给过来的反馈一般会比较慢(相对于继续执行后面的程序而言),这时候一般需要做一个设置,那就是等对方的反馈回来了之后再执行后面的程序,不过如果没有特别设置,js是不会这么做的,这时候如果有3个方法,中间那个需要请求,不做设置的话,第二个还没有等到拿到请求结果就输出了,结果就是undefined,因为没有拿到任何东西。

举例:

<script>
    function one () {
        return 'I am one'
    }
    
    function two () {
        setTimeout(() => {
            return 'I am two'
        }, 3000)
    }

    function three () {
        return 'I am three'
    }

    function run () {
        console.log(one())
        console.log(two())
        console.log(three())
    }

    run()
</script>

执行上面的代码,two()会输出undefined,因为该方法需要3秒才能执行完,但是由于没有设置,还没有执行完就返回了,结果就是undefined。

那么,如何才能让run()按顺序执行one() two() three()呢?一共分两步:

第一步:在two()里面返回一个Promise,将two()改成:

function two () {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve('I am two')
        }, 3000)
    })
}

这段代码里,一个Promise会返回两个状态,resolve或者reject,基本上可以理解为success和error,在resolve里填写如果反馈成功后要返回的东西即可。

第二步:调用的时候设置要async和await

当你在定义一个类似run()方法时,如果这里面涉及到需要等待结果的方法(比如请求资源的),这时候要在这个方法前面加上async,表示这是一个包含异步请求的方法,然后在里面具体的需要等待结果的方法前面,加上await,也就是说,需要等这个方法获得了返回结果之后,再继续往下面执行。所以run()就可以改成这样:

    function run () {
        console.log(one())
        console.log(two())
        console.log(three())
    }

这时候,整体代码变成这样:

<script>
    function one () {
        return 'I am one'
    }
    
    // function two () {
    //     setTimeout(() => {
    //         return 'I am two'
    //     }, 3000)
    // }

    function two () {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve('I am two')
            }, 3000)
        })
    }

    function three () {
        return 'I am three'
    }

    async function run () {
        console.log(one())
        console.log(await two())
        console.log(three())
    }

    run()
</script>

再执行的话,就会发现one()先出结果,等3秒后,two()出结果,紧跟着three()的结果也出来了。

这个就是promise, resolve, reject, async, await的最基础知识了吧,写出来加深一下理解,如果有初学者能看到,也许也可以获得一些启发。

更复杂的知识,参考这里

最后编辑:2021年01月05日 ©著作权归作者所有

发表评论