异步async

 async

  用来处理异步,它是对 Promise 的一种扩展,让异步更加方便;async 是基于 Promise 的,虽然是异步操作,但看上去像同步,更容易理解。

let p1=new Promise((resolve,reject)=>{
    setTimeout(()=>{
        resolve("异步1");
    },3500);
});
let p2=new Promise((resolve,reject)=>{
    setTimeout(()=>{
        resolve("异步2");
    },800);
});
let p3=new Promise((resolve,reject)=>{
    setTimeout(()=>{
        resolve("异步3");
    },1500);
});

  语法:在函数前加 async 关键字即可

   await 关键字:async 函数中有一个 await 关键字,用于等待一个 Promise 对象,即在async 函数执行时,如果遇到 await 就会先暂停执行 ,等到触发的异步操作完成后,再恢复 async 函数的执行并返回解析值。 

  注:await 关键字仅在异步函数 async function 内部有效。如果在 async function 函数体外使用 await ,你只会得到一个语法错误。

let as=async()=>{
    let result=await p1;
    console.log(result); 
}
as(); //异步1

async function as(){
    let result=await p1;
    console.log(result);
}
as(); //异步1

  

async在进行多个异步时,可以不使用 .then,更清晰

  .then:

p1.then(val=>{
    console.log(val);
    return p2;
}).then(val=>{
    console.log(val);
    return p3;
}).then(val=>{
    console.log(val);
})

  async:

async function as(){
    let r1=await p1,
        r2=await p2,
        r3=await p3;
    console.log(r1); 
    console.log(r2); 
    console.log(r3); 
}
as();

    

 

 提供了类似 Promise.all() 方法:

async function as(){
    let all=[await p1,await p2, await p3];
    console.log(all);
}
as();

  

 

 async函数如果设返回值,返回的会是一个Promise对象,可以使用 then 方法进行下一步操作。return 语句返回的值,会成为 then方法回调函数 resolve 的参数。
// 返回值是Promise对象
// 相当于 Promise.resolve()
async function as(){
    return "async";
}
console.log(as());
as().then(val=>{
    console.log(val);
})

  

 

  如果 return 返回的是 await Promise 对象,若要得到返回值,直接调用方法是不可行的,会提前返回pending状态,
async function as(){
    return await p1;
}
//
async function as(){
    let r=await p1;
    return r;
}
console.log(as());

     

 这个时候如果想要输出值,还是需要使用 .then

as().then(val=>{
    console.log(val);
});

  

 

 

 

 

posted @ 2021-12-01 23:55  十七日尾  阅读(627)  评论(0)    收藏  举报