promise解决异步问题:.then和async_await的渊源
1.为什么要使⽤回调函数?
当我们的请求既有异步,⼜有同步的时候,如果异步请求在同步请求的上⽅,异步请求⽐较慢,要先等待异步请求执⾏完再去执⾏同步请求,⽐较耗时。这时候我们将异步请求放在⼀个回调函数⾥,就不必等待异步请求执⾏完再去执⾏同步请求。
其实使⽤回调函数最终⽬的是为了获得外层普通函数(同步请求)的执⾏结果res,使⽤箭头函数的最终⽬的是为了获得上⼀个回调函数的执⾏结果res.
2.为什么使⽤promise呢?
在⼀段代码中,如果有两个异步请求,例如有两个回调函数,我们想让第⼀个函数(代码在上⽅)执⾏完成之后,得到⼀个结果,再去执⾏第⼆个函数(代码在下⽅)
由于异步请求的执⾏不⼀定是按照代码从上到下的顺序执⾏的,因此程序有可能先执⾏第⼆个函数,再去执⾏第⼀个函数,这样就会报错。为了解决这个问题,传统的⽅法
是将第⼆个回调函数嵌套在第⼀个回调函数内部,就可以保证第⼀个回调函数执⾏完成后再执⾏第⼆个
回调函数。但是问题⼜来了,如果⼀段代码中有多个回调函数,就要不停的嵌套,就会进⼊回调地狱,这时候promise就派上⽤场了。
有了 Promise 对象,就可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。
promise可以使⽤.then(res)=>{函数体}的⽅式,将上⼀个函数返回结果res作为参数传递到下⼀个回调函数中去,这样就能保证上⼀个函数执⾏完成之后,再执⾏下⼀个函数。其中axios就是基于promise的。
await和async使用方法qpromise()
.then((res)=>{
//code
return res.a;
})
.then((res)=>{
/
/code
return res.b;
})
.then((res)=>{
//code
return res.c;
})
采⽤链式写法,即then后在调⽤另⼀个then⽅法
3.
ES6规定,Promise 对象是⼀个构造函数,⽤来⽣成Promise 实例。
下⾯的代码就是⼀个Promise 实例:
var promise=new Promise(function(resolve,reject){
//code
if(/*异步操作*/){
resolve();
}else{
reject();
}
})
Promise构造函数接受⼀个函数作为参数,该函数有两个参数分别是resolve和reject,它们也是函数。
resolve函数的作⽤是,将Promise 对象的状态从“未完成”(pending)==>“成功”(resolved),在异步操作成功时调⽤,并将异步操作结果,作为参数传递出去。
reject函数的作⽤是,将Promise 对象的状态从“未完成”(pending)==>“失败”(rejected),再异步操作失败时调⽤,并将操作报错的错误,作为参数传递出去。
3.紧接着问题⼜来了,这样还是会产⽣很多回调函数,要不停的.then(()=>{ }),现在async和await就派上⽤场了,它可以让异步⽅法执⾏的顺序依据我们的需求⽽定,两者是结合使⽤的,await后⾯跟的是promise实例,
也就是说,async,await和promise三者必须连⽤。
例如我们现在有两个promise实例,
那么我们会先执⾏fnPromise1(),再执⾏fnPromise2(),虽然fnPromise1()是在3秒之后执⾏,fnPromise2()是在2秒之后执⾏,按理说应该先执⾏fnPromise2(),但是由于我们⽤了await,就相当于同步,先执⾏第⼀个await,再执⾏第⼆个await. await要放在异步⽅法⾥⾯使⽤,和promise或者async结合使⽤。⽆论是使⽤箭头函数,还是使⽤await,最终结果都是获得promise.
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论