@@ -363,20 +363,30 @@ Object.defineProperty(Object.prototype, Symbol.isConcatSpreadable, {
363363// 1. Lookup @@iterator property on `array` (user-mutable if user-provided).
364364// 2. Lookup @@iterator property on %Array.prototype% (user-mutable).
365365// 3. Lookup `next` property on %ArrayIteratorPrototype% (user-mutable).
366+ // 4. Lookup `then` property on %Array.Prototype% (user-mutable).
367+ // 5. Lookup `then` property on %Object.Prototype% (user-mutable).
366368PromiseAll ([]); // unsafe
367369
368- PromiseAll (new SafeArrayIterator ([])); // safe
370+ // 1. Lookup `then` property on %Array.Prototype% (user-mutable).
371+ // 2. Lookup `then` property on %Object.Prototype% (user-mutable).
372+ PromiseAll (new SafeArrayIterator ([])); // still unsafe
373+ SafePromiseAll ([]); // still unsafe
374+
375+ SafePromiseAllReturnVoid ([]); // safe
376+ SafePromiseAllReturnArrayLike ([]); // safe
369377
370378const array = [promise];
371379const set = new SafeSet ().add (promise);
372380// When running one of these functions on a non-empty iterable, it will also:
373- // 4. Lookup `then` property on `promise` (user-mutable if user-provided).
374- // 5. Lookup `then` property on `%Promise.prototype%` (user-mutable).
381+ // 1. Lookup `then` property on `promise` (user-mutable if user-provided).
382+ // 2. Lookup `then` property on `%Promise.prototype%` (user-mutable).
383+ // 3. Lookup `then` property on %Array.Prototype% (user-mutable).
384+ // 4. Lookup `then` property on %Object.Prototype% (user-mutable).
375385PromiseAll (new SafeArrayIterator (array)); // unsafe
376-
377386PromiseAll (set); // unsafe
378387
379- SafePromiseAll (array); // safe
388+ SafePromiseAllReturnVoid (array); // safe
389+ SafePromiseAllReturnArrayLike (array); // safe
380390
381391// Some key differences between `SafePromise[...]` and `Promise[...]` methods:
382392
@@ -385,11 +395,18 @@ SafePromiseAll(array); // safe
385395SafePromiseAll (ArrayPrototypeMap (array, someFunction));
386396SafePromiseAll (array, someFunction); // Same as the above, but more efficient.
387397
388- // 2. SafePromiseAll, SafePromiseAllSettled, SafePromiseAny, and SafePromiseRace
389- // only support arrays, not iterables. Use ArrayFrom to convert an iterable
390- // to an array.
391- SafePromiseAll (set); // ignores set content.
392- SafePromiseAll (ArrayFrom (set)); // safe
398+ // 2. SafePromiseAll, SafePromiseAllSettled, SafePromiseAny, SafePromiseRace,
399+ // SafePromiseAllReturnArrayLike, SafePromiseAllReturnVoid, and
400+ // SafePromiseAllSettledReturnVoid only support arrays and array-like
401+ // objects, not iterables. Use ArrayFrom to convert an iterable to an array.
402+ SafePromiseAllReturnVoid (set); // ignores set content.
403+ SafePromiseAllReturnVoid (ArrayFrom (set)); // works
404+
405+ // 3. SafePromiseAllReturnArrayLike is safer than SafePromiseAll, however you
406+ // should not use them when its return value is passed to the user as it can
407+ // be surprising for them not to receive a genuine array.
408+ SafePromiseAllReturnArrayLike (array).then ((val ) => Array .isArray (val)); // false
409+ SafePromiseAll (array).then ((val ) => Array .isArray (val)); // true
393410```
394411
395412</details >
0 commit comments