aysn和await

声明:1.解决异步调用的写法和同步保持一致。

           2.async是声明获取异步调用结果的函数,而await是声明在async函数中获取异步调用的结果的语句。

           3.异步调用一般返回为promise,async执行完也会返回promise。

例1:

function A(guess){
    return new Promise((resolve, reject)=>{
        let sino = parseInt(Math.random() * 6 +1)
        if(sino > 3){
            if(guess === '大'){
                resolve(sino)
            }else{
                reject(sino)
            }
        }else{
            if(guess === '大'){
                reject(sino)
            }else{
                resolve(sino)
            }
        }

        setTimeout(()=>{
            resolve('hello')
        },3000)
    })
}
async function test(){
    try{
        //把await及获取它的值的操作放在try里
        let n =await A('大')
        console.log('赢了' + n)
    }catch(error){
      //失败的操作放在catch里
        console.log('输了' + error)
    }
}
test()
//输了1

 解析:await会等待异步调用的结果,获取到调用结果之后进行向下执行同步语句。正常返回时promise中的resolve(n), 异常返回为promise重的reject(n),它只接受一次resolve和reject,promise中的第二次resolve或者reject不接受。如果要获取多个异步调用的结果,使用Promise.all。

例2:

async function test(){
    try{
        //把await及获取它的值的操作放在try里
        let n =await Promise.all([A('大'),A('大')])
        console.log('赢了' + n)
    }catch(error){
      //失败的操作放在catch里
        console.log('输了' + error)
    }
}
//赢了4,5 获取输了3
promise.all里面跟一个数组,数组的每一项是一个返回promise的函数调用,then的第一个参数是所有的promise都成功后调用,拿到所有promise的结果是一个数组;
第二个参数拿到的是第一个失败的值。
async执行完也会返回promise,而且promise中的resolve的值为async函数的返回值,没有返回即为undefined。
例子3:
async function f1() {
  console.log('1');
//   return ('1')
}
console.log(f1()) //Promise { undefined }
例子4:
async function f1() {
  console.log('1');
  return ('1')
}
console.log(f1()) //Promise { '1' }
例子5:
async function f1() {
  console.log('1');
  return ('1')
}
f1().then(function(x1) {console.log('x1=',x1)}) //x1=1

 如何await等待的不是promise对象,则立即获取返回,继续向下执行。

例子6:

function getN(){
// 如果是同步代码,则按照同步顺序代码执行。 setTimeout(
function(){ console.log('返回的不是promise') //4 return 4 },2000) } async function test(){ console.log('我在test中执行') //1 在await之前都是同步执行1 var n = await getN(); console.log(n); //undefined,因为返回的不是promise. } test(); console.log('先执行我,然后执行await') //2 //我在test中执行 //先执行我,然后执行await //undefined // 返回的不是promise
如果它等到的是一个 promise 对象,await 也会暂停async后面的代码,先执行async外面的同步代码,等着 Promise 对象 fulfilled,然后把 resolve 的参数作为 await 表达式的运算结果。
例子7:
function getN(){
    return new Promise((resolve, reject) => {
        setTimeout(function(){
            console.log('返回的不是promise') //3
            resolve(4)
        },2000)
    })
   
}
async function test(){
    console.log('我在test中执行') //  在await之前都是同步执行1
    var n = await getN();
    console.log(n);  //4
}
test();
console.log('先执行我,然后执行await') //2
// 我在test中执行
// 先执行我,然后执行await
// 返回的不是promise
// 4

 如果promise没有返回值,则await会阻碍后面的代码执行:

例子8:

function getN(){
    return new Promise((resolve, reject) => {
        console.log('hello')
    })
}
async function test(){
    console.log('我在test中执行') //  在await之前都是同步执行1
    await getN();
    console.log('不会执行');  //4
}
test();
console.log('先执行我,然后执行await') //2
//我在test中执行
//hello
//先执行我,然后执行await

另外,当出现await预计之后:和promise中的then的执行一样,结束!

posted @ 2020-03-04 13:18  anthonyliu  阅读(676)  评论(0编辑  收藏  举报