关于异步

65 阅读2分钟
1.为什么我们需要promise

起初我们要做到异步,是通过回调函数来进行的,但是这样做会出现两个问题,第一是回调函数执行的时机我们不知道,这就导致我们无法对回调的结果进行操作,其次假如需要对结果进行多次操作,那就需要在回调函数里面再回调,那就出现了回调地狱。第二是对于回调结果的处理,通过回调函数解决的异步问题,不管是成功的操作还是失败的操作都是在同一个回调函数里面进行操作,这显然不是我们想要的,所以就出现了promise.

2.promise如何解决上面的问题的

首先它里面有resolve和reject,通过这两个调相应的回调,然后通过调用.then对不同的结果进行处理,因为.then返回的是promise,所以可以通过对.then的对用解决回调地狱的问题。对.then的多次调用不是嵌套式的而是链式的。

3.几点要注意的点
  • promise一旦状态确定就不能改变了,但是如果返回了promise,那么就以返回的promise的状态为准。
  • 在resolve里面抛出错误或者给出错误的返回值那么最后的状态是reject,而在reject里面返回一个成功的promise,最后的状态还是reject,返回的只不过作为理由传出。
  • .fanally是用来解决最后的异步操作的,但此时如果返回错误,那么状态变为reject,如果返回一个promise,并且这个promise的状态是待定的,那么此时.finally的状态就是待定的。
4.async和await
  • async让代码具有异步的特性,但是整体上还是同步求值。
  • await让后面的代码加入微任务队列,先执行await所在的这一行语句,其实内部做的就是把await后面的语句加入到resolve()里面,而这个语句下的代码就放到.then里面。但是何时将后面代码添加到微任务队列,要等promise的状态确定了才添加。如果不是promise就直接添加。