确定的世界 - The Promise’s World
—— Promise的逻辑以及在Lua中的实现
本文基于如下项目(ES6 Promise in lua v1.0.1):
有这样一个世界
有这样的一个世界在持续地向前推进着,这个世界充满着无穷多个选择,也就是说有无穷多的可能;但对每一个选择来说,存在决定/未决两种状态,如果已经决定,则只能有yes/no两种结果之一。这个世界看起来就是下面这个样子:
那么,这个世界是确定的么?
首先,这个世界是有状态的,那些看起来存在y/n两个分支的节点,就存在于这种状态——选择还没有发生,就还有可能。
然而无论某一个节点的选择是什么,这个的世界的结果(的规模)是确定的,它必然演进到世界最下层中的状态的某一个。只不过这个最下层的规模足够大,所以在世界中的“未决”因素足够多的情况下,这个世界就看起来“一切皆有可能”而已。
而这也就是Promise’s World,确定的世界。
什么是已决定的?
到底什么是已“确定”的呢?当你举起手枪对着自己的头的时候,这个行为是“确定”的吗?
答案是:这个行为是“确定”的,你只是没有“决定”而已。这个称为“用枪瞄准自己的头”的系统很确定:要么是死,要么是不死——死或不死都是确定的。在语言中,你可以理解为:布尔值是确定的值,它确定的是yes/no。
布尔值被理解为一个“已决定(它的结果行为)的”系统。同理,所有值类型的数据,所有有已决定结果的数据,都是确定的。这在promise中被这样定义下来:
local function promised_y(self, onFulfilled)
-- ...
end
-- ...
-- promise for basetype
local number_promise = setmetatable({andThen = promised_y}, promise)
local true_promise = setmetatable({andThen = promised_y, true}, promise)
local false_promise = setmetatable({andThen = promised_y, false}, promise)
number_promise.__index = number_promise
nil_promise.andThen = promised_y
Ok,这里的代码的意思是说,number/string/boolean,以及nil这些值的行为(andThen)都是已决定的,指向promised_y()。
javascript的promise规范中,这里被称为.then()方法,而拥有这样一个方法的对象被称为thenable object。这个方法有确定的接口:
function (onFulfilled, onRejected)
但在lua中由于then是保留字,所以只好用andThen作为方法名(也有用next来作为方法名的)。
同样,一个对象(lua中的table)也是已决定的,在promise中它与一般的value并没有不同。因此,在lua中的Promise.resolve(value)实现为如下:
function Promise.resolve(value)
local valueType = type(value)
if valueType == 'nil' then
return nil_promise
elseif valueType == 'boolean' then
return value and true_promise or