|
4 | 4 | // in https://github.com/mysticatea/abort-controller (MIT license)
|
5 | 5 |
|
6 | 6 | const {
|
| 7 | + ArrayPrototypePush, |
7 | 8 | ObjectAssign,
|
8 | 9 | ObjectDefineProperties,
|
9 | 10 | ObjectDefineProperty,
|
@@ -373,17 +374,36 @@ ObjectDefineProperty(AbortSignal.prototype, SymbolToStringTag, {
|
373 | 374 | defineEventHandler(AbortSignal.prototype, 'abort');
|
374 | 375 |
|
375 | 376 | function abortSignal(signal, reason) {
|
| 377 | + // 1. If signal is aborted, then return. |
376 | 378 | if (signal[kAborted]) return;
|
377 | 379 | signal[kAborted] = true;
|
| 380 | + // 2. Set signal's abort reason to reason if it is given; |
| 381 | + // otherwise to a new "AbortError" DOMException. |
378 | 382 | signal[kReason] = reason;
|
| 383 | + // 3. Let dependentSignalsToAbort be a new list. |
| 384 | + const dependentSignalsToAbort = []; |
| 385 | + // 4. For each dependentSignal of signal's dependent signals: |
| 386 | + signal[kDependantSignals]?.forEach((s) => { |
| 387 | + const dependentSignal = s.deref(); |
| 388 | + // 1. If dependentSignal is not aborted, then: |
| 389 | + if (dependentSignal && !dependentSignal[kAborted]) { |
| 390 | + // 1. Set dependentSignal's abort reason to signal's abort reason. |
| 391 | + dependentSignal[kReason] = reason; |
| 392 | + // 2. Append dependentSignal to dependentSignalsToAbort. |
| 393 | + ArrayPrototypePush(dependentSignalsToAbort, dependentSignal); |
| 394 | + } |
| 395 | + }); |
| 396 | + // 5. Run the abort steps for signal |
379 | 397 | const event = new Event('abort', {
|
380 | 398 | [kTrustEvent]: true,
|
381 | 399 | });
|
382 | 400 | signal.dispatchEvent(event);
|
383 |
| - signal[kDependantSignals]?.forEach((s) => { |
384 |
| - const signalRef = s.deref(); |
385 |
| - if (signalRef) abortSignal(signalRef, reason); |
386 |
| - }); |
| 401 | + // 6. For each dependentSignal of dependentSignalsToAbort, |
| 402 | + // run the abort steps for dependentSignal. |
| 403 | + for (let i = 0; i < dependentSignalsToAbort.length; i++) { |
| 404 | + const dependentSignal = dependentSignalsToAbort[i]; |
| 405 | + if (dependentSignal) abortSignal(dependentSignal, reason); |
| 406 | + }; |
387 | 407 | }
|
388 | 408 |
|
389 | 409 | class AbortController {
|
|
0 commit comments