流程控制,generator,promise
promise
使用 bluebird 库,Promise 包含 then 方法存放回调.
由未完成态,转向 完成态(onFulfilled) 和 失败态(onRejected),使用 resolve 和 reject 转换。
https://github.com/petkaantonov/bluebird/blob/master/API.md#api-reference
Demo
1 | var Promise = require("bluebird"); |
这里我们有一个传统的 node callback 形式的getUser
,getUserAsync
返回一个 Promise
new Promise,手动构建 Promise
Promise.promisify
上面示例中的getUserAsync
是手动写的,完成的就是Promise.promisify
的工作api:
Promise.promisify(function,receiver)
, reviver 表示 function 的 this 值
generator
MDN : https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/function*
使用什么的看 http://www.toobug.net/article/learning_es6_generator.html
copy 这个示例过来
1 | function* genFn() { |
执行第一个 next,执行到 yield 1
暂停,
执行第二个 next,执行到 yield 2
暂停,
执行第三个 next,传入的 next(333)
被 var value3 = yield 2
接受,value3 = 333
放在一起
所谓放在一起,是指 generator yield 的是 Promise,在 promise 完成后继续执行下面的代码,同时把 Promise 的 resolve 值传给 next
如
1 | // getUserAsync() 返回一个promise |
新版的 co(co@4.0) 就是用 Promise 重写的,而且 co(fn)
- 立即执行,不用以前
co(fn)()
- 返回 Promise
bluebird & co 的例子
1 | global.Promise = require("bluebird"); |
可以这样使用
实现也很简单,就是把 generator.next 加到 yield 返回的 Promise 的 then 上面,把控制流串联起来。
1 | function co(genFn) { |
当然没有 co 考虑那么多。
generator 和 Promise 放在一起,跟 C#里面的 async/await/Task
很类似
标记 | 等待 | 结果承载 | |
---|---|---|---|
C#.NET | async | await | Task<TResult> |
JS | function*(){ … } | yield | Promise |
Promise.coroutine
bluebird 中也带了 generator 的一些东西 https://github.com/petkaantonov/bluebird/blob/master/API.md#generators
跟 co 差不多,现在的 co 应该可以拿这个这样实现
- module.exports = Promise.coroutine;
- Promise.coroutine.addYieldHandler() // 添加 yield thunk,array,object 等类型时处理方式