zoukankan      html  css  js  c++  java
  • 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); //3 } 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的执行一样,结束!

  • 相关阅读:
    解决下载Android源码时遇到的 download error
    将HTML5封装成android应用APK
    实现静默安装和卸载应用
    java获取当前类的绝对路径
    c# winform程序如何获取命令行带参数启动时的参数
    安装软件时提示:Error 1324. The path My Documents contains a invalid character
    C# Winform 禁止重复运行
    Java获取JSON参数
    Ext JS 4: Override timeouts
    查看oracle数据库的连接数以及用户
  • 原文地址:https://www.cnblogs.com/liuyinlei/p/12408924.html
Copyright © 2011-2022 走看看