(proms)
| 151 | |
| 152 | # basically an implementation of Promise.all |
| 153 | def wait_all(proms): |
| 154 | cbs = CallbackPromise() |
| 155 | |
| 156 | if not isinstance(proms, (list, tuple)): |
| 157 | proms = tuple(proms) |
| 158 | num_completed = 0 |
| 159 | num_proms = len(proms) |
| 160 | |
| 161 | if num_proms == 0: |
| 162 | cbs.resolve(()) |
| 163 | return cbs |
| 164 | |
| 165 | results = [None] * num_proms |
| 166 | |
| 167 | # needs to be a separate function for creating a closure in a loop |
| 168 | def register_promise(i, prom): |
| 169 | prom_completed = False |
| 170 | |
| 171 | def promise_done(success, res): |
| 172 | nonlocal prom_completed, results, num_completed |
| 173 | if prom_completed or cbs.done: |
| 174 | return |
| 175 | prom_completed = True |
| 176 | if success: |
| 177 | results[i] = res |
| 178 | num_completed += 1 |
| 179 | if num_completed == num_proms: |
| 180 | result = tuple(results) |
| 181 | del results |
| 182 | cbs.resolve(result) |
| 183 | else: |
| 184 | del results |
| 185 | cbs.reject(res) |
| 186 | |
| 187 | _resolve(prom).then( |
| 188 | lambda res: promise_done(True, res), |
| 189 | lambda err: promise_done(False, err), |
| 190 | ) |
| 191 | |
| 192 | for i, prom in enumerate(proms): |
| 193 | register_promise(i, prom) |
| 194 | |
| 195 | return cbs |
| 196 | |
| 197 | |
| 198 | if browser: |
nothing calls this directly
no test coverage detected