美文网首页
一次性搞懂 Promise、async await 与 Gene

一次性搞懂 Promise、async await 与 Gene

作者: 前端好有趣 | 来源:发表于2020-09-03 10:45 被阅读0次

    学习 ES6 的时候,经常听到 Promise、async await 与 Generator 用来处理异步函数,但又不清楚它们的具体用法。所以,今天专门对这三者进行一下系统的概述。

    三者的关系

    promise

    generatorasync/await 都是是基于 promise 的实现。

    promise

    功能:返回一个异步结果

    function myPromise(isReject,val){
        return new Promise((resolve,reject) => {
            isReject ? reject('err') : 
            // 写法一:运用setTimeout的第三个参数
            setTimeout(resolve,2000,val)
            // 写法二:常规写法
            setTimeout(()=>{
                resolve(val)
            },5000)
        })
    }
    

    该函数可以模拟成功、失败这两种结果。

    Async/await

    var myasync =  async function() {
        // 这个value1就是myPromise函数里面resolve的值,不用.then来取,await做了内部处理
        var value1 = await myPromise(false,2)
        return value1
    }
    // async返回的是一个promise,相当于value1被Promise.resolve()封装成Promise对象返回,所以在外面反而需要.then来获取
    console.log(myasync().then(res => console.log(res)))
    

    generator

    function * myGenerator() {
        yield myPromise(false,1)
    }
    console.log(myGenerator().next())  // {value: Promise, done: false}
    console.log(myGenerator().next().value.then((res) => console.log(res)))
    

    generator和普通函数的区别:

    function* sum(x) {
        var y = yield x +2;
        return y;
      }
      
      var val = sum(1);
      console.log( val.next()) // { value: 3, done: false }
      console.log( val.next()) // { value: undefined, done: true }
    
    // 真实的异步执行例子
    function* sum(){
      var result = yield myPromise(false,3);
      console.log(result);
    }
    sum.next().value.then(res => console.log(res))
    
    • 普通函数没有 * 标志,这是generator函数的标志
    • 普通函数调用会返回结果,generator函数调用不会返回结果,返回的是指针对象val,这个对象有两个值value,done,values就是yield语句后面的表达式的值,done只有遇到return才会变成true

    Async/await和generator的区别:

    var sum = async function (){
      var value2 = await myPromise(false,4);
      return value2;
    };
    
    • async只是generator的一个语法糖,他相当于*,await相当于yield
    • asyncawait,比起星号和 yield,语义更清楚了
    • yield命令后面只能是 Thunk函数或 Promise对象,而 async函数的 await命令后面,可以跟 Promise对象和原始类型的值(数值、字符串和布尔值,但这时等同于同步操作)

    相关文章

      网友评论

          本文标题:一次性搞懂 Promise、async await 与 Gene

          本文链接:https://www.haomeiwen.com/subject/kgbirktx.html