目的
CallbackList
是一个 统一异步与同步统一写法、拆分组合代码 的解决方案简单来讲,是一个轻量级模块系统
CallbackList的目的是将多个 函数、异步操作、Promise 统统包装成一个能够完成复杂任务的Promise对象
其中每个任务都要符合给定的协议(比如this、参数、返回值的要求)
进而可以将每个单独的简单任务 重复使用,任意组合 成为能够完成不同复杂任务的promise
概念
任务 - 贯穿整个系统的关键概念
CallbackList
按顺序执行每一个回调,每一个回调中一般都做且只做一件事为了区分普通回调函数,文档里把这个回调叫任务。
运行时对象
CallbackList
执行时,所有任务共享相同的this对象为了方便,文档里这个 this 叫运行时
thenable
Promise对象常见的有
AV.Promse
、ES6-Promise
、promise模块
、
jQuery.Deferred
。它们的共同特点是:有一个then方法,它第一个参数是resolve-callback,第二个参数是reject-callback。
API *两种流程的方法都是连贯操作方法
正常流程
next(Function cb)
向回调列表添加一个普通任务cb函数可以返回:
- thenable
:下一个任务的参数是它的resolve后的值(有的库支持多个值,比如
AV.Promise.when()
,于是下个任务的参数就有多个),如果被reject,则开始错误流程。 - ApiError :进入错误流程
- 其他普通值 :直接开始下一个任务,下一个任务的唯一参数就是这个返回值(除非返回了arguments对象,则下一个函数将使用arguments代表的多个参数)
check(Function cb)
向回调列表添加一个用于“检查”的特殊任务check不能影响下一个任务的参数
cb函数可以返回:
- false或ApiError :进入错误流程
- true :则继续执行接下来的任务
- thenable :如果它resolve,见 1↖。如果reject,则进入错误流程(reject的第一个参数如果是ApiError,则错误对象就是它,否则是 E_CHECK_FAIL)
- 其他值(包括没有返回值) :抛异常,你必须返回true或false,可以转换为true、false的对象也都不行
fork(Function cb)
向回调列表添加一个用于“分支”的特殊任务fork不能影响下一个任务的参数
cb函数可以返回:
- 另一个CallbackList :这个list会以当前 arguments&this 调用,且无视其返回值
- 不返回 :直接执行接下来的任务
- ApiError :进入错误流程
错误流程 * 没有任何恢复运行的方法,一旦进入错误流程,就只能reject而不能恢复
on_error(Function cb)
只有next和check后才能调用这个方法,它处理上一个函数可能产生的错误参数是错误对象,返回值作为reject的参数
thrown(ApiError e)
只有next和check后才能调用这个方法无论它们出了什么错误,抛了什么异常,都用 e 对象进行reject。
只有在前一个方法极端的简单,以至于它能发生的错误可以预见,才用这个方法。否则on_error更合适。
本地调试时,原本的错误信息会被输出到控制台,线上环境将没有任何日志,可能应该手动添加一些日志。
例:
cl.check(function (order){
return order.status === 0; // 如果 order.status != 0,则输出 “E_STATE_ERROR”
}).thrown(ApiError.E_STATE_ERROR);
caught(Function cb)
全局处理函数参数是错误对象,返回值作为reject的参数
注意:
- 只有没被上面两个方法处理的错误才会调用这个函数
- 一个
CallbackList
只能有一个全局处理函数 - 只处理当前
CallbackList
的,不处理fork出的list内的
其他非流程方法
create_instance(Array argList, Object thisArg)
从第一个任务开始调用列表,并指定参数列表和this对象thisArg可选,默认新建空对象 “{}”
还可以用
CallbackList.create_instance(CallbackList cbList, Array argList, Object thisArg);
来调用
返回一个Promise,用最后一个任务返回值resolve。
getFunction()
返回一个包装着 create_instance 的函数cbcb被调用时,它的参数 arguments 作为 argList,它的 this 作为 thisArg,它会返回Promise