首页 目录 View on GitHub

the Leancloud framework G

返回

目的

CallbackList 是一个 统一异步与同步统一写法、拆分组合代码 的解决方案
简单来讲,是一个轻量级模块系统

CallbackList的目的是将多个 函数、异步操作、Promise 统统包装成一个能够完成复杂任务的Promise对象
其中每个任务都要符合给定的协议(比如this、参数、返回值的要求)
进而可以将每个单独的简单任务 重复使用任意组合 成为能够完成不同复杂任务的promise

概念

任务 - 贯穿整个系统的关键概念
CallbackList 按顺序执行每一个回调,每一个回调中一般都做且只做一件事
为了区分普通回调函数,文档里把这个回调叫任务。
运行时对象
CallbackList 执行时,所有任务共享相同的this对象
为了方便,文档里这个 this 叫运行时
thenable
Promise对象
常见的有 AV.PromseES6-Promisepromise模块jQuery.Deferred
它们的共同特点是:有一个then方法,它第一个参数是resolve-callback,第二个参数是reject-callback。

API *两种流程的方法都是连贯操作方法

正常流程

next(Function cb)

向回调列表添加一个普通任务
cb函数可以返回:
  1. thenable :下一个任务的参数是它的resolve后的值(有的库支持多个值,比如 AV.Promise.when(),于是下个任务的参数就有多个),如果被reject,则开始错误流程。
  2. ApiError :进入错误流程
  3. 其他普通值 :直接开始下一个任务,下一个任务的唯一参数就是这个返回值(除非返回了arguments对象,则下一个函数将使用arguments代表的多个参数)

check(Function cb)

向回调列表添加一个用于“检查”的特殊任务
check不能影响下一个任务的参数
cb函数可以返回:
  1. false或ApiError :进入错误流程
  2. true :则继续执行接下来的任务
  3. thenable :如果它resolve,见 1↖。如果reject,则进入错误流程(reject的第一个参数如果是ApiError,则错误对象就是它,否则是 E_CHECK_FAIL)
  4. 其他值(包括没有返回值) :抛异常,你必须返回true或false,可以转换为true、false的对象也都不行

fork(Function cb)

向回调列表添加一个用于“分支”的特殊任务
fork不能影响下一个任务的参数
cb函数可以返回:
  1. 另一个CallbackList :这个list会以当前 arguments&this 调用,且无视其返回值
  2. 不返回 :直接执行接下来的任务
  3. ApiError :进入错误流程
* 注意这个调用是同步的,即fork出的list执行完毕后才会继续执行接下来的任务。

错误流程 * 没有任何恢复运行的方法,一旦进入错误流程,就只能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的参数
注意:

其他非流程方法

create_instance(Array argList, Object thisArg)

从第一个任务开始调用列表,并指定参数列表和this对象
thisArg可选,默认新建空对象 “{}”
还可以用 CallbackList.create_instance(CallbackList cbList, Array argList, Object thisArg); 来调用
返回一个Promise,用最后一个任务返回值resolve。

getFunction()

返回一个包装着 create_instance 的函数cb
cb被调用时,它的参数 arguments 作为 argList,它的 this 作为 thisArg,它会返回Promise