zoukankan      html  css  js  c++  java
  • Promise async-await 异步解决方案

    1.简介:

     

     
    async和await在干什么,async用于申明一个function是异步的,而await可以认为是async wait的简写,等待一个异步方法执行完成。

    2.基本语法

     

    在Chrome里申明这样一个函数,可以在控制台看到返回的其实就是一个Promise对象。
    扩展需要了解的就是Chrome现在也支持asyncFunction,可以在Chrome控制台测试:
    console.log(async function(){}.constructor);
    ƒ AsyncFunction() { [native code] }

    3.规则

     
    如图,await放在普通函数里是会报错的。

     
    eg:
    async function demo() {
        let result = await Promise.resolve(123);
        console.log(result);
    }
    demo();

    4.应用

    Promise虽然一方面解决了callback的回调地狱,但是相对的把回调“纵向发展”了,形成了一个回调链。eg:

    function sleep(wait) {
        return new Promise((res,rej) => {
            setTimeout(() => {
                res(wait);
            },wait);
        });
    }
    
    /*
    let p1 = sleep(100);
    let p2 = sleep(200);
    let p =*/
    
    sleep(100).then(result => {
        return sleep(result + 100);
    }).then(result02 => {
        return sleep(result02 + 100);
    }).then(result03 => {
        console.log(result03);
    })

    控制台:
    300

    后面的结果都是依赖前面的结果。
    改成async/await写法就是:

    async function demo() {
        let result01 = await sleep(100);
        //上一个await执行之后才会执行下一句
        let result02 = await sleep(result01 + 100);
        let result03 = await sleep(result02 + 100);
        // console.log(result03);
        return result03;
    }
    
    demo().then(result => {
        console.log(result);
    });

    因为async返回的也是promise对象,所以用then接受就行了。
    结果:
    300
    需要注意的就是await是强制把异步变成了同步,这一句代码执行完,才会执行下一句。

    5.错误处理

     
    如果是reject状态,可以用try-catch捕捉
    eg:
    let p = new Promise((resolve,reject) => {
        setTimeout(() => {
            reject('error');
        },1000);
    });
    
    async function demo(params) {
        try {
            let result = await p;
        }catch(e) {
            console.log(e);
        }
    }
    
    demo();

    结果:
    error
    这是基本的错误处理,但是当内部出现一些错误时,和上面Promise有点类似,demo()函数不会报错,还是需要catch回调捕捉。这就是内部的错误被“静默”处理了

    let p = new Promise((resolve,reject) => {
        setTimeout(() => {
            reject('error');
        },1000);
    });
    
    async function demo(params) {
        // try {
            let result = name;
        // }catch(e) {
        //     console.log(e);
        // }
    }
    
    demo().catch((err) => {
        console.log(err);
    })

    6.注意你的并行执行和循环

    比如上面的例子:

    async function demo() {
        let result01 = await sleep(100);
        //上一个await执行之后才会执行下一句
        let result02 = await sleep(result01 + 100);
        let result03 = await sleep(result02 + 100);
        // console.log(result03);
        return result03;
    }
    
    demo().then(result => {
        console.log(result);
    });

    如果这三个是你想异步发出的AJAX请求,在这段代码里其实是同步的,第一个发出去才会发第二个,所以async/await需要谨慎使用。


    现在有一些forEach或者map的循环里,比如在forEach里使用await,这时候的上下文就变成了array,而不是async function,就会报错。这时候你就要想到是什么错误。

  • 相关阅读:
    SugarCRM 主表自定义字段日期型
    算法导论46 VLSI芯片测试
    算法导论14.18
    算法导论13.24
    poj1980 Unit Fraction Partition **
    算法导论5.12
    算法导论76 对区间的模糊排序
    红黑树(redblack tree)算法,附AVL树的比较
    poj1856 Sea Battle *
    算法导论42 找出所缺的整数
  • 原文地址:https://www.cnblogs.com/mica/p/10775320.html
Copyright © 2011-2022 走看看