Ver Fonte

LibJS: Call resolve instead of reject in AsyncFromSyncIteratorPrototype

davidot há 2 anos atrás
pai
commit
fb61e9274a

+ 1 - 1
Userland/Libraries/LibJS/Runtime/AsyncFromSyncIteratorPrototype.cpp

@@ -118,7 +118,7 @@ JS_DEFINE_NATIVE_FUNCTION(AsyncFromSyncIteratorPrototype::return_)
         auto* iter_result = create_iterator_result_object(vm, vm.argument(0), true);
 
         // b. Perform ! Call(promiseCapability.[[Resolve]], undefined, « iterResult »).
-        MUST(call(vm, *promise_capability.reject, js_undefined(), iter_result));
+        MUST(call(vm, *promise_capability.resolve, js_undefined(), iter_result));
 
         // c. Return promiseCapability.[[Promise]].
         return promise_capability.promise;

+ 24 - 0
Userland/Libraries/LibJS/Tests/loops/for-await-of.js

@@ -44,6 +44,30 @@ describe("basic behavior", () => {
         expect(loopIterations).toBe(1);
         expect(rejected).toBeFalse();
     });
+
+    test("can break a for-await-of loop", () => {
+        var loopIterations = 0;
+        var rejected = false;
+        async function f() {
+            for await (const v of [1, 2, 3]) {
+                expect(v).toBe(1);
+                loopIterations++;
+                break;
+            }
+        }
+
+        f().then(
+            () => {
+                expect(loopIterations).toBe(1);
+            },
+            () => {
+                rejected = true;
+            }
+        );
+        runQueuedPromiseJobs();
+        expect(loopIterations).toBe(1);
+        expect(rejected).toBeFalse();
+    });
 });
 
 describe("only allowed in async functions", () => {