Comparison

util/promise.lua @ 9513:4f4f9823bd1d

util.promise: Some code relocation
author Matthew Wild <mwild1@gmail.com>
date Thu, 18 Oct 2018 12:12:52 +0100
parent 9512:439cf3bbe5f3
child 9514:9db707a86a25
comparison
equal deleted inserted replaced
9512:439cf3bbe5f3 9513:4f4f9823bd1d
53 end 53 end
54 end 54 end
55 return _resolve, _reject; 55 return _resolve, _reject;
56 end 56 end
57 57
58 local function new(f)
59 local p = setmetatable({ _state = "pending", _next = next_pending, _pending_on_fulfilled = {}, _pending_on_rejected = {} }, promise_mt);
60 if f then
61 local resolve, reject = new_resolve_functions(p);
62 local ok, ret = pcall(f, resolve, reject);
63 if not ok and p._state == "pending" then
64 reject(ret);
65 end
66 end
67 return p;
68 end
69
70 local function wrap_handler(f, resolve, reject) 58 local function wrap_handler(f, resolve, reject)
71 return function (param) 59 return function (param)
72 local ok, ret = pcall(f, param); 60 local ok, ret = pcall(f, param);
73 if ok then 61 if ok then
74 resolve(ret); 62 resolve(ret);
76 reject(ret); 64 reject(ret);
77 end 65 end
78 end; 66 end;
79 end 67 end
80 68
81 function promise_methods:next(on_fulfilled, on_rejected) 69 local function new(f)
82 return new(function (resolve, reject) 70 local p = setmetatable({ _state = "pending", _next = next_pending, _pending_on_fulfilled = {}, _pending_on_rejected = {} }, promise_mt);
83 self:_next( 71 if f then
84 on_fulfilled and wrap_handler(on_fulfilled, resolve, reject) or nil, 72 local resolve, reject = new_resolve_functions(p);
85 on_rejected and wrap_handler(on_rejected, resolve, reject) or nil 73 local ok, ret = pcall(f, resolve, reject);
86 ); 74 if not ok and p._state == "pending" then
87 end); 75 reject(ret);
88 end 76 end
89 77 end
90 function promise_methods:catch(on_rejected) 78 return p;
91 return self:next(nil, on_rejected);
92 end 79 end
93 80
94 local function all(promises) 81 local function all(promises)
95 return new(function (resolve, reject) 82 return new(function (resolve, reject)
96 local count, total, results = 0, #promises, {}; 83 local count, total, results = 0, #promises, {};
124 return new(function (_, _reject) 111 return new(function (_, _reject)
125 _reject(v); 112 _reject(v);
126 end); 113 end);
127 end 114 end
128 115
116 function promise_methods:next(on_fulfilled, on_rejected)
117 return new(function (resolve, reject) --luacheck: ignore 431/resolve 431/reject
118 self:_next(
119 on_fulfilled and wrap_handler(on_fulfilled, resolve, reject) or nil,
120 on_rejected and wrap_handler(on_rejected, resolve, reject) or nil
121 );
122 end);
123 end
124
125 function promise_methods:catch(on_rejected)
126 return self:next(nil, on_rejected);
127 end
128
129 return { 129 return {
130 new = new; 130 new = new;
131 resolve = resolve; 131 resolve = resolve;
132 reject = reject; 132 reject = reject;
133 all = all; 133 all = all;