]> git.kaiwu.me - njs.git/commitdiff
Promise: reject empty any inputs
authorDmitry Volyntsev <xeioex@nginx.com>
Tue, 22 Sep 2026 04:56:00 +0000 (21:56 -0700)
committerDmitry Volyntsev <xeioexception@gmail.com>
Fri, 25 Sep 2026 23:00:29 +0000 (16:00 -0700)
Reject Promise.any() with an AggregateError when the input contains no
promises, as required by the promise combinator semantics.

src/njs_promise.c
test/js/promise_any.t.js
test/njs_test262.failures

index 016c6859766e402abf902bdbf8996cf4a8224385..fadde167c8368f6943767e6d8182cdb9b074cf34 100644 (file)
@@ -1291,7 +1291,10 @@ njs_promise_perform_all(njs_vm_t *vm, njs_value_t *iterator,
             njs_error_stack_attach(vm, argument, 1);
         }
 
-        ret = njs_function_call(vm, njs_function(&pargs->capability->resolve),
+        ret = njs_function_call(vm, njs_function(handler
+                                      == njs_promise_perform_any_handler
+                                  ? &pargs->capability->reject
+                                  : &pargs->capability->resolve),
                                 &njs_value_undefined, &argument, 1, retval);
         if (njs_slow_path(ret == NJS_ERROR)) {
             return ret;
index fb287ba9ce4ed0df5f82f8adca0cf931a99307e4..d97e8484e3c47acbe8517088dca8afa078834d81 100644 (file)
@@ -7,8 +7,14 @@ var p0 = Promise.resolve().then(() => { throw 'foo' });
 var p1 = Promise.reject(2).catch(v => v * 2);
 var p2 = Promise.resolve(1).then(v => v + 1);
 
-Promise.any([p0, p1, p2]).then(
-    v => assert.sameValue(v, 4),
-    v => $DONOTEVALUATE(),
-)
+Promise.any([]).then(
+    () => $DONOTEVALUATE(),
+    e => {
+        assert.sameValue(e.constructor, AggregateError);
+        assert.sameValue(e.errors.length, 0);
+    },
+).then(() => Promise.any([p0, p1, p2]).then(
+        v => assert.sameValue(v, 4),
+        v => $DONOTEVALUATE(),
+    ))
 .then($DONE, $DONE);
index 2e3086630d7687d161c86d7608e5c9d58ac0b90c..4d261624cdc43562c0edfb40e9c252be8ebfb5e4 100644 (file)
@@ -456,8 +456,6 @@ built-ins/Promise/allSettled/resolve-non-callable.js        strict
 built-ins/Promise/allSettled/resolve-not-callable-reject-with-typeerror.js     strict
 built-ins/Promise/allSettled/resolve-throws-iterator-return-is-not-callable.js strict
 built-ins/Promise/allSettled/resolve-throws-iterator-return-null-or-undefined.js       strict
-built-ins/Promise/any/call-reject-element-after-return.js      strict
-built-ins/Promise/any/call-reject-element-items.js     strict
 built-ins/Promise/any/capability-reject-throws-no-close.js     strict
 built-ins/Promise/any/capability-resolve-throws-no-close.js    strict
 built-ins/Promise/any/capability-resolve-throws-reject.js      strict
@@ -471,8 +469,6 @@ built-ins/Promise/any/invoke-resolve.js     strict
 built-ins/Promise/any/invoke-then-error-reject.js      strict
 built-ins/Promise/any/invoke-then-get-error-reject.js  strict
 built-ins/Promise/any/invoke-then-on-promises-every-iteration.js       strict
-built-ins/Promise/any/iter-arg-is-empty-iterable-reject.js     strict
-built-ins/Promise/any/iter-arg-is-empty-string-reject.js       strict
 built-ins/Promise/any/iter-arg-is-error-object-reject.js       strict
 built-ins/Promise/any/iter-arg-is-false-reject.js      strict
 built-ins/Promise/any/iter-arg-is-null-reject.js       strict
@@ -490,7 +486,6 @@ built-ins/Promise/any/iter-returns-string-reject.js strict
 built-ins/Promise/any/iter-returns-symbol-reject.js    strict
 built-ins/Promise/any/iter-returns-true-reject.js      strict
 built-ins/Promise/any/iter-returns-undefined-reject.js strict
-built-ins/Promise/any/resolve-before-loop-exit.js      strict
 built-ins/Promise/any/resolve-non-callable.js  strict
 built-ins/Promise/any/resolve-not-callable-reject-with-typeerror.js    strict
 built-ins/Promise/any/resolve-throws-iterator-return-is-not-callable.js        strict