Software /
code /
prosody
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) |