Comparison

util/promise.lua @ 11483:24ce9d380475

util.promise: Add support for arbitrary keys in all()/all_settled()
author Matthew Wild <mwild1@gmail.com>
date Thu, 25 Mar 2021 13:51:16 +0000
parent 11211:1151140fc757
child 11484:a0120e935442
comparison
equal deleted inserted replaced
11482:671f6b867e0d 11483:24ce9d380475
89 return p; 89 return p;
90 end 90 end
91 91
92 local function all(promises) 92 local function all(promises)
93 return new(function (resolve, reject) 93 return new(function (resolve, reject)
94 local count, total, results = 0, #promises, {}; 94 local settled, results, loop_finished = 0, {}, false;
95 for i = 1, total do 95 local total = 0;
96 promises[i]:next(function (v) 96 for k, v in pairs(promises) do
97 results[i] = v; 97 total = total + 1;
98 count = count + 1; 98 v:next(function (value)
99 if count == total then 99 results[k] = value;
100 settled = settled + 1;
101 if settled == total and loop_finished then
100 resolve(results); 102 resolve(results);
101 end 103 end
102 end, reject); 104 end, reject);
105 end
106 loop_finished = true;
107 if settled == total then
108 resolve(results);
103 end 109 end
104 end); 110 end);
105 end 111 end
106 112
107 local function all_settled(promises) 113 local function all_settled(promises)
108 return new(function (resolve) 114 return new(function (resolve)
109 local count, total, results = 0, #promises, {}; 115 local settled, results, loop_finished = 0, {}, false;
110 for i = 1, total do 116 local total = 0;
111 promises[i]:next(function (v) 117 for k, v in pairs(promises) do
112 results[i] = { status = "fulfilled", value = v }; 118 total = total + 1;
113 count = count + 1; 119 v:next(function (value)
114 if count == total then 120 results[k] = { status = "fulfilled", value = value };
121 settled = settled + 1;
122 if settled == total and loop_finished then
115 resolve(results); 123 resolve(results);
116 end 124 end
117 end, function (e) 125 end, function (e)
118 results[i] = { status = "rejected", reason = e }; 126 results[k] = { status = "rejected", reason = e };
119 count = count + 1; 127 settled = settled + 1;
120 if count == total then 128 if settled == total and loop_finished then
121 resolve(results); 129 resolve(results);
122 end 130 end
123 end); 131 end);
132 end
133 loop_finished = true;
134 if settled == total then
135 resolve(results);
124 end 136 end
125 end); 137 end);
126 end 138 end
127 139
128 local function race(promises) 140 local function race(promises)