之前刚刚开始接触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的最基础知识了吧,写出来加深一下理解,如果有初学者能看到,也许也可以获得一些启发。
更复杂的知识,参考这里。
最新回复