zoukankan      html  css  js  c++  java
  • js generator妙用

    /**
     * generator的精华在于next的参数,这样的能力才让generetor成为了一种强悍的流程能力
     */
    
    function mypromise() {
      return Promise.resolve({x: 1})
    }
    
    
    function* mygen() {
      var data = yield mypromise()
      console.log(data)
      return data
    }
    
    
    var x = mygen()
    
    var y = x.next()
    
    // 利用next(data)的特性可以将generetor中的promise展开,直接更改yeild执行上下文的返回变量值
    // 这个技巧被用在mobx-state-tree中的flow上
    y.value.then(data => {
      x.next(data)
    })
    
    
    // 实现一个flow
    function flow(gen, args) {
      let _gen = gen(args);
    
      function _next(h) {
        if (h.done) {
          console.log('flow end!!')
          return h.value;
        }
        if (h.value instanceof Promise) {
          h.value.then(res  => {
            _next(_gen.next(res))
          })
        } else {
          _next(_gen.next(h.value))
        }
      }
    
      return _next(_gen.next())
    }
    
    function* chains(){
      var data1 = yield Promise.resolve({x: "flow1"})
    
      console.log('data1: ', data1)
    
      var x = data1.x;
    
      console.log('x: ', x)
    
      var data2 = yield x + " ==> flow2";
    
      console.log('data2: ', data2)
    
      return data2
    }
    
    
    // 执行这个flow, 有意思的事情来了
    flow(chains)
    

  • 相关阅读:
    Linux线程(一)
    模板(一)
    C++基础(八)
    C++基础(七)
    C++基础(六)
    C++基础(五)
    2.C#基础(二)
    1.C#基础(一)
    2.给出距离1900年1月1日的天数,求日期
    网络协议破解 SMTP
  • 原文地址:https://www.cnblogs.com/magma/p/14955884.html
Copyright © 2011-2022 走看看