prmoise,async和await,同步与异步的理解
异步的意义:
同步与异步:
1.同步任务:在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务。
2.异步任务:不进入主线程,任务队列的任务,只有任务队列通知主线程,某个异步任务可以执行了,这个任务才会进入主线程执行。
js为单线程执行,同步的写法导致如果执行中有一个任务耗时较长,js就会一直等待该任务直到返回结果后才会继续向下执行。这样就造成了代码执行阻塞的问题。于是有异步的方式可以让某些任务进入到一个异步队列中,暂时让主进程跳过该任务继续向下执行。
异步的解决:
在异步中,如果需要前一个任务的结果作为下一个任务的参数执行,就需要在前一个任务的类似success()中继续写下一个人物的代码,造成嵌套层级过多的回调地狱。于是使用promise可以解决这个问题,例如链式操作的then(),catch(),但如果多个promise同时处理还是会写出类似回调地狱的写法。而搭配async和await可以达到用同步的方法处理异步。
关于promise.then()返回的新promise的结果状态由什么决定?
.then()方法里接收两个函数作为参数,分别是resolve和jeject后执行的回调。返回的一个新的promise实例。相当于then方法是两个实际的回调函数,第一个回调函数是定义promise执行成功时resolve括号里的数据,这样就可以异步拿到数据了。第二个回调函数是定义promise执行失败时reject括号里的数据。
1.return值的情况
function test(){ const promise = new Promise((resolve,reject)=> { setTimeout(function(){ resolve('执行成功') },1000) }) return promise; } test().then(aData =>{ console.log('aData',aData) return '9' }).then(bData =>{ console.log('bData',bData) }) 输出结果是: aData 执行成功 bData 9 当不写return 9时,第二行输出为undefined
2.throw error
返回得promise会成为rejected的状态,下一步执行catch中的回调函数或者then的第二个回调函数参数。
3.返回一个新promise,此promise的结果就会成为新promise的结果
ps:promise.all()方法:
Promise.all方法用于将多个Promise实例,包装成一个新的Promise实例。 var p = Promise.all([p1,p2,p3]); 上面代码中,Promise.all方法接受一个数组作为参数,p1、p2、p3都是Promise对象的实例。(Promise.all方法的参数不一定是数组,但是必须具有iterator接口,且返回的每个成员都是Promise实例。) p的状态由p1、p2、p3决定,分成两种情况。 只有p1、p2、p3的状态都变成fulfilled,p的状态才会变成fulfilled,此时p1、p2、p3的返回值组成一个数组,传递给p的回调函数。 只要p1、p2、p3之中有一个被rejected,p的状态就变成rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数。
promise.rase()方法:
Promise.race方法同样是将多个Promise实例,包装成一个新的Promise实例。 var p = Promise.race([p1,p2,p3]); 上面代码中,只要p1、p2、p3之中有一个实例率先改变状态,p的状态就跟着改变。那个率先改变的Promise实例的返回值,就传递给p的回调函数。 如果Promise.all方法和Promise.race方法的参数,不是Promise实例,就会先调用下面讲到的Promise.resolve方法,将参数转为Promise实例,再进一步处理。
async,await的概念和意义:
于是有了async和await,async的函数中可以有一个或多个异步操作,一旦遇到await就会返回一个pending等待状态的promise对象,暂时返回了执行代码的控制权。使得函数外的代码得以继续执行。这是保证非阻塞的部分。等await后的异步请求resolve或reject,主线程才会继续执行async函数内后面的部分。async函数内部异步代码就像被同步执行一样,而不是阻塞主线程知道异步调用返回。
一句话概括:async函数内阻塞,函数外不阻塞。
async:作为关键字写在函数前,代表改函数为异步函数,不会阻塞后续的进行。函数会返回一个promise对象,用then()获取其中的值,如果函数内部抛出错误,有一个catch()方法进行捕获。
await“:等待一个返回值,常量变量函数promise等,
为什么await只能配合async中使用?
await等的是一个返回结果,如果是同步状态,即直接返回了,如果是异步,await会阻塞接下来的流程,直到返回结果,而async会被包裹在一个promise中执行,所以await只能在async中使用,否则阻塞正常进程。
资料:https://www.zhihu.com/question/62254462