JS中的yield

之前接触到JS中的yield,因为没有能够理解它的运行机制,导致一个问题查了许久。现在简单总结一下:
简单来说,yield是JS为了解决异步调用的命令。表示程序执行到这里会交出执行权,等待结果返回。它需要在协程Generator 函数中运行。

function* gen(x){
  var y = yield x + 2;
  return y;
}
上面代码就是一个 Generator 函数。它不同于普通函数,是可以暂停执行的,所以函数名之前要加星号,以示区别。
整个 Generator 函数就是一个封装的异步任务,或者说是异步任务的容器。异步操作需要暂停的地方,都用 yield 语句注明。

var g = gen(1);
g.next() // { value: 3, done: false }
g.next() // { value: undefined, done: true }

上面代码中,调用 Generator 函数,会返回一个内部指针(即遍历器g 。这是 Generator 函数不同于普通函数的另一个地方,即执行它不会返回结果,返回的是指针对象。调用指针 g 的 next 方法,会移动内部指针(即执行异步任务的第一段),指向第一个遇到的 yield 语句,上例是执行到 x + 2 为止。

但是为了不用每次都调用next方法,因此引入了Promise和Thunk。Thunk在JS中只能有一个回调函数作为它的参数。Promise对象代表一个异步操作,一般后面跟then方法,Promise改变时会触发。对它我还有一些疑问,需要进一步了解。
最后来到co 函数。它接受 Generator 函数作为参数,返回一个 Promise 对象,它可以自动执行Generator 函数,这样异步的代码看上去就和同步差不多了。但是yield表达式的对象必须是Promise或Thunk。
问题:yield ssh.connect这样的代码,是否ssh、connect之类的命令中封装的返回值是Promise对象?
参考资料:
http://www.ruanyifeng.com/blog/2015/04/generator.html
https://blog.csdn.net/qq20004604/article/details/77555279

你可能感兴趣的:(JS中的yield)