async/await特点
async/await更加语义化,async是“异步”的简写,async function 用于申明一个function是异步的; await,可以认为是async wait的简写, 用于等待一个异步方法执行完成;
async/await是一个用同步思维解决异步问题的方案(等结果出来之后,代码才会继续往下执行)
可以通过多层async function的同步写法代替传统的callback嵌套

The async keyword before a function has two effects:
1.Makes it always return a promise.
2.Allows to use await in it.
If the caller does not make use of await(respectively then with promises) then your code will not run asynchronously
async关键字
1)表明程序里可能有异步过程
async表明程序里可能有异步过程(有await关键字);全部是同步代码也没关系,但async就显得多余了;
2)非阻塞
async函数里如果有异步过程会等待,但async函数本身会马上返回,不会阻塞当前线程。可以简单认为async函数工作在主线程,同步执行,不会阻塞界面渲染;async函数内部由await修饰的异步过程,工作在相应的协程上,会阻塞等待异步任务的完成再返回;
3)async函数返回类型为Promise对象
async函数会返回一个promise,并且Promise对象的状态值是resolved(成功的)
如果没有在async函数中写return,那么Promise对象resolve的值就是是undefined
如果写了return,那么return的值就会作为成功的时候传入的值
这是和普通函数本质上不同的地方,也是使用时重点注意的地方:
(1)return new Promise();这个符合async函数本意;
(2)return data;这是同步函数的写法,特别注意这其实就相当于Promise.resolve(data);还是一个Promise对象;但在调用async函数的地方通过简单的=是拿不到这个data的,因为返回值是一个Promise对象,所以需要用.then(data => { })才可以拿到data;
(3)如果没有返回值,相当于返回了Promise.resolve(undefined);
example:
asyn function(){
return await 1
}
返回值:resove(1)
4)无等待
在没有await的情况下执行async函数,它会立即执行,返回一个Promise对象,并且不会阻塞后面的语句,这和普通返回Promise对象的函数并无二致;
5)内部的await不处理异步error
await是不管异步过程的reject(error)消息的,async函数返回的这个Promise对象的catch函数负责统一抓取内部所有异步过程的错误;async函数内部只要有一个异步过程发生错误,整个执行过程就中断,这个返回的Promise对象的catch就能抓取到这个错误;
使用async和await获取成功的结果
function 摇色子(){
return new Promise((resolve,reject)=>{
let sino=parseInt(Math.random()*6+1)
setTimeout(()=>{resolve(sino)},3000)
})
}
async function test(){
let n=await 摇色子()
console.log(n)
}
test()
上面这段代码async中使await 摇色子()先执行,等到三秒后执行完再把得到的结果赋值给左边的n,也就是说test函数需要三秒钟才执行完成,所以test函数是异步的,因此前面必须写async
获取失败的结果: 把await和成功后的操作放到try里,失败的放在catch
function 摇色子(猜测){
return new Promise((resolve,reject)=>{
let sino=parseInt(Math.random()*6+1)
if(sino>3){
if(猜测==='大') resolve(sino)
else reject(sino)
}else{
if(猜测==='大') reject(sino)
else resolve(sino)
}
setTimeout(()=>{resolve(sino)},300)
})
}
async function test(){
try{
//把await及获取它的值的操作放在try里
let n=await 摇色子('大')
console.log('赢了'+n)
}catch(error){
//失败的操作放在catch里
console.log('输了'+error)
}
}
test()
有多个promise,怎么拿到所有的promise都结束后的结果
比如有两个色子,想得到这两个色子的点数?
1.使用promise.all
function 摇色子(猜测){
return new Promise((resolve,reject)=>{
let sino=parseInt(Math.random()*6+1)
if(sino>3){
if(猜测==='大') resolve(sino)
else reject(sino)
}else{
if(猜测==='大') reject(sino)
else resolve(sino)
}
setTimeout(()=>{resolve(sino)},300)
})
}
Promise.all([摇色子('大'),摇色子('大')])
.then(
(x)=>{console.log(x)},
(y)=>{console.log(y)}
)
promise.all里面跟一个数组,数组的每一项是一个返回promise的函数调用;
then的第一个参数是所有的promise都调用成功后,拿到所有promise的结果,是一个数组;第二个参数拿到的是第一个失败的值。
2.使用await
await是直接获取多个promise的结果的,因为Promise.all()返回的也是一个promise所以如果要使用await拿到多个promise的值,可以直接await Promise.all()
async function test(){
try{
let n=await Promise.all([摇色子('大'),摇色子('大')])
console.log(n)
}catch(error){
console.log(error)
}
}
test()
async实现原理(spawn函数)
async和await源码
网友评论