阅读 76

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)

原文:https://www.cnblogs.com/magma/p/14955884.html

文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐