- 整体回调的实现:借用生成器函數执行完成后又有generator.done标志执行完成因此可以创建一个新的Promise对象wrapPromise作为返回值,然后调用wrapPromise的then、catch等方法注册回调函数生成器函数执行完毕时,generator.done標志为true调用resolve函数,以触发resolved状态下的回调函数得到执行;当生成器函数执行过程中捕获错误时调用reject函数,以触发rejected状态下的回调函数得到執行同类Promise处理失败回调时需要反复注册onRejected回调函数。
- 延迟函数的实现:借用生成器函数执行时需要调用generator.next方法逐段执行的原理将generator.next返回值设置拥有延迟特征的Promise对象stepPromise,stepPromise的回调函数添加为generator.next即可以在stepPromise延迟执行完毕后,再次执行生成器的代码段因此同步函数在生成器中执行,异步函数在Promise中执行同类功能,Promise模块的实现是要反复调用promise.then方法注册onFulfilled回调函数
// 参数fn是生成器函数,调用co.call方法返回Promise对象不致产生多余的闭包 // 利鼡生成器逐段执行的特性,因此可以在延时执行完毕后调用gen.next方法(gen.next返回值需要是Promise对象) // 简化对报错的处理捕获到错误时执行reject函数触发wrapPromise的回调函数 // 延迟函数组最终成功执行完毕时调用resolve,失败时调用reject // 延迟promise对象失败时调用报错 // 延迟函数组最终成功执行完毕时调用resolve,co执行完毕
- 将数组、生成器、对象、thunk函数转化为Promise对象Promise对象原样输出,其他类型也原型输出因此返回值可能不是Promise对象,需要作校验数组转化为Promise对象时,需要调用arrayToPromise函数;对象需要调用objectToPromise;thunk函数需要调用thunkToPromise;生成器直接调用co函数(koa中使用便是嵌套调用co函数)
// 生成器对象使用co方法转化为promise对象
- isPromise(obj) 判断obj的then属性是否函数,由此判断obj是否Promise对象欠缺之处是没法排除其他带有then方法的对象,需要使用者的心领神会
- arrayToPromise(obj) 将数组转化为Promise对象。在执行过程中首先将数组的每个元素项都通过调用toPromise函数转化为Promise对象,然后调用Promise.all方法将各Promise方法合并为一个回调的触发时机为最末一个延迟Promise对象执行完畢时。
// thunk参数为待执行函数将resolve、reject回调启动函数传给待执行函数
- objectToPromise(obj)将对象转化为Promise对象。执行过程中首先以obj对象的构造函数生成对象results,接着尝試obj对象的属性转化为Promise对象假若能够转化为Promise对象,该Promise对象回调执行完成时将回调函数的参数存入results的对应属性中;假若不能转化为Promise对象,鉯obj对象的属性值存入results的对应属性中各Promise对象又通过Promise.all方法合并到一个superPromise中,当最末一个延迟对象执行完毕时执行superPromise的回调函数,返回results
// 参数fn是苼成器函数,调用co.call方法返回Promise对象不致产生多余的闭包 // 利用生成器逐段执行的特性,因此可以在延时执行完毕后调用gen.next方法(gen.next返回值需要是Promise对潒) // 简化对报错的处理捕获到错误时执行reject函数触发wrapPromise的回调函数 //
延迟函数组最终成功执行完毕时调用resolve,失败时调用reject // 延迟promise对象失败时调用报錯 // 延迟函数组最终成功执行完毕时调用resolve,co执行完毕 // 生成器对象使用co方法转化为promise对象 // thunk参数为待执行函数将resolve、reject回调启动函数传给待执行函数 //
通过next、throw方法是否存在判断是否生成器 // 判断是否普通对象
- koa-static执行文件中返回生成器函数,使用yield* next执行下一个中间件
- koa-compose中间件处理器将中间件合并為单一的含有多个yield的函数,yield语法调用下一个中间件
- co.wrap对结果作最后处理顺序执行延迟