Generator

作者: 我的钱包瘪瘪的 | 来源:发表于2020-03-11 09:11 被阅读0次

Generator

  • 概念: Generator 函数返回的遍历器对象
  • 基本用法

        // 定义生成器函数
        function* g() {
          yield "a";
          yield "b";
          yield "c";
          return "ending";
        }
        // 返回Generator对象
        console.log(g()); // g {<suspended>}
        console.log(g().toString()); // [object Generator]
    
  • 每次next执行一次yield, 并返回 {value: "a", done: false}

        function* g() {
          yield "a";
          yield "b";
          yield "c";
          return "ending";
        }
        
        var gen = g();
        // console.log(gen.next()); // {value: "a", done: false}
        // console.log(gen.next()); // {value: "b", done: false}
        // console.log(gen.next()); // {value: "c", done: false}
        // console.log(gen.next()); // {value: "ending", done: true}
        // 没有return时, 最后也会打印`{value: undefined, done: false}`
        
        
        // next方法代替上面手动next()
        function next() {
          let { value, done } = gen.next();
          console.log(value); // 依次打印输出 a b c end
          if (!done) next(); // 直到全部完成
        }
        next();
    
    
  • 传参问题

        function* say(foo) {
          let a = yield foo;
          console.log(a);
          let b = yield "2";
          console.log(b);
        }
        
        let it = say("bar"); // 返回迭代器
        
        // a的值并非yield返回值,而是下次next参数
        // 此次执行, 只到yield, 没有到赋值a
        console.log(it.next());
        // 输出 { value: 'bar', done: false }
        
        // 第二次的next(参数), 才会赋值到a
        console.log(it.next("我是被传进来的1"));
        // 输出'我是被传进来的1'
        // 输出{ value: '2', done: false }
        
        console.log(it.next("我是被传进来的2"));
        // 输出'我是被传进来的2'
        // 输出{ value: undefined, done: true }
    
  • 搭配promise, 处理异步(异步一的回调当参数传给异步二)

        // 使用Generator顺序执行两次异步操作
        function* r(num) {
          // 此次yield返回 {value: promise, done: false }
          const r1 = yield compute(num);
          yield compute(r1);
        }
        
        // compute为异步操作,结合Promise使用可以轻松实现异步操作队列
        function compute(num) {
          return new Promise(resolve => {
            setTimeout(() => {
              const ret = num * num;
              console.log(ret); // 输出处理结果
              resolve(ret); // 操作成功
            }, 1000);
          });
        }
        
        // 不使用递归函数调用
        let it = r(2);
        // {value: promise,done:false}
        // it.next().value.then(num => it.next(num));
        
        // 修改为可处理Promise的next
        function next(data) {
          let { value, done } = it.next(data); // 启动
          if (!done) {
            value.then(num => {
              next(num);
            });
          }
        }
        
        next();
    
  • async-await

    1. 区别: 是generator的一种特殊形式的语法糖, 并没有完全实现generator异步流程的控制

相关文章

网友评论

      本文标题:Generator

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