11.Generator函数

2020-06-28  本文已影响0人  web_jianshu
<!DOCTYPE html>

<html lang="en">

  <head>

    <meta charset="UTF-8" />

    <meta name="viewport" content="width=device-width, initial-scale=1.0" />

    <meta http-equiv="X-UA-Compatible" content="ie=edge" />

    <title>Document</title>

  </head>

  <body></body>

</html>

<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>

<script>

  let p1 = () => {

    return new Promise((resolve, reject) => {

      $.get("http://127.0.0.1:5000/api/1", res => {

        resolve(res);

        reject(res);

      });

    });

  };

  let p2 = msg => {

    return new Promise((resolve, reject) => {

      $.get("http://127.0.0.1:5000/api/2", { msg: msg }, res => {

        resolve(res);

      });

    });

  };

  //   p1()

  //     .then(res => {

  //       console.log(res);

  //       return p2(123);

  //     })

  //     .then(res => {

  //       console.log(res);

  //     });

  //   let all = Promise.all([p1(), p2()]);

  //   all.then(res => {

  //     console.log(res);

  //   });

  // 假如:上面两个异步是封装在一个函数当中

  // 使用generator函数实现了异步同步的书写

  // 满足条件:p1返回结果当作p2的参数

  // Generator函数是一个普通函数,但是有两个特征.一是,function关键字与函数名之间有一个星号

  // 二是,函数体内部使用yield表达式, 定义不同的内部状态(yield在英语里的意思就是“产出”)

  // 我们把需要做异步的代码放在yield表达式后面

  // 定义Generator函数

  //   function* getAll() {

  //     // generator函数体内部代码通过迭代器的next方法调用执行

  //     let p1val = yield p1(); // 调用next迭代generator函数

  //     console.log("p1val", p1val); // p1val是调用第二个next传进来的

  //     let p2val = yield p2(p1val);

  //     // 还有其他代码,必须等yield代码执行结束

  //   }

  //   // 调用Generator函数 返回Generator函数生成的对象(迭代器)

  //   let all = getAll();

  //   console.log(all); // 迭代器

  //   console.log(all.next()); // {value: Promise, done: false}

  //   console.log(all.next()); // {value: Promise, done: false}

  //   console.log(all.next()); // {value: undefined, done: true}

  // 表示执行第一个yield后面的异步方法得到value值为Promise实例对象(某一个状态)

  // done 为 false代表后面还有yield 当前generator函数还没有执行完成

  // true代表当前generator函数里面所有异步方法全部执行结束

  //   all.next().value.then(res1 => {

  //       console.log('res1', res1);

  //       all.next(res1).value.then(res2 => {

  //           console.log(res2);

  //       }).catch(err => {

  //           console.log(err);

  //       })

  //   }).catch(err => {

  //       console.log(err);

  //   })

  // async 函数是 ES7(babel 支持)引入的 Generator 函数的语法糖

  // p1()必须是一个Promise对象 ,如果不是就会使用 Promise构造函数来包裹 ,并执行resolve

  async function getAll() {

    let p1val = await p1();

    // .then(res => {

    //     console.log('success', res);

    // }).catch(err => {

    //     console.log('err', err);

    // }) // p1执行了resolve之后,主动的调用next  await返回值p1val永远是调用resolve结果

    console.log("await", p1val);

    let p2val = await p2(p1val);

    console.log(p2val);

    // 还有其他代码,必须等yield代码执行结束

    // await与.catch相反 相当于.then第一个回调函数的结果

  }

  getAll();

</script>
上一篇 下一篇

猜你喜欢

热点阅读