ES6中await从零起步(一)

这个系列的文章是我看阮一峰大神的《ES6标准入门》一书的总结,因为实在是有些复杂,所以整理一下加深一下理解,也排解一下寂寞.....

首先先上效果
然后搬运代码

function* hello() {
  yield "hello";
  yield "world";
  return "ending";
}

var hw = hello();
console.log(hw.next());
console.log(hw.next());
console.log(hw.next());
console.log(hw.next());

代码很简单,只是按书中的代码稍加变化
首先上面定义的是一个generator函数,声明generator函数也很简单只需要在function后面加 * 就可以了。那么generator函数有什么特别之处呐:

  1. generator函数会返回一个遍历器

遍历器简单的说就是js中定义的典型对象,这种对象含有一个next方法,方法的返回值是一个含有 value,done 两个值的对象。

  1. generator函数提供了关键字yield使函数实现了分布执行的,每一个yield都可以视为一个断点,而next函数就是下一步按钮

这里我们可以大概了解到generator函数的主要亮点就是实现了函数的分步执行,还有一些细节的特性,大家感兴趣,可以去翻翻原书,这里就不细说了,估计很难用的上。
然后讲讲书中说的几个典型的应用

  • 将原来回调函数中的逻辑,放到调用函数下方:
// 回调函数的写法
function fun1(val, callback) {
  // do something
  ...
  callback()
}

// generator
function* fun2(val) {
  // do something
  ...
  yield;
  // 后面写原来的callback代码
  // callback
}
var it = fun2()
// 先执行yield上面的逻辑
it.next()
// 执行callback 代码
it.next()

这种方法,我是不太喜欢,感觉还不如之前的回调的写法。没那么直白爽快的感觉,两次next()感觉像卡了一下那种感觉。

  • 第二种方法是这样的
// generator
function* fun2(val) {
  yield fun3();
  // 后面写原来的callback代码
  // callback
}
function fun3() {
  // do something
  ...
  it.next()
}
var it = fun2()
// 先执行yield上面的逻辑
it.next()

这种方法可以看作上面的变种,他将之前yield之前的逻辑放入了fun3中并在其中调用it.next(),这样在外面调用的时候就只用一次next就行了。但是这样也有一个很明显的问题,就是fun3必须对主函数中的it可见,在平时编码的时候,很有可能fun3并不能有调用时的上下文,这就很尴尬。

你可能感兴趣的:(ES6中await从零起步(一))