diff --git a/testing/web-platform/tests/dom/observable/tentative/observable-from.any.js b/testing/web-platform/tests/dom/observable/tentative/observable-from.any.js index db51f341d512..674b0018051f 100644 --- a/testing/web-platform/tests/dom/observable/tentative/observable-from.any.js +++ b/testing/web-platform/tests/dom/observable/tentative/observable-from.any.js @@ -4011,6 +4011,163 @@ competing " ) ; +test +( +( +) += +> +{ +const +results += +[ +] +; +const +array += +[ +1 +2 +3 +4 +5 +] +; +const +source += +Observable +. +from +( +array +) +; +source +. +subscribe +( +{ +next +: +v += +> +{ +results +. +push +( +v +) +; +if +( +v += += += +3 +) +{ +source +. +subscribe +( +{ +next +: +v += +> +results +. +push +( +v +) +complete +: +( +) += +> +results +. +push +( +' +inner +complete +' +) +} +) +; +} +} +complete +: +( +) += +> +results +. +push +( +' +outer +complete +' +) +} +) +; +assert_array_equals +( +results +[ +1 +2 +3 +1 +2 +3 +4 +5 +' +inner +complete +' +4 +5 +' +outer +complete +' +] +) +; +} +" +from +( +) +: +Sync +iterable +multiple +in +- +flight +subscriptions +competing +" +) +; promise_test ( async @@ -4950,8 +5107,7 @@ return promise_test ( async -( -) +t = > { @@ -4962,65 +5118,23 @@ results ] ; const -async_iterable +iterable = { -asyncIteratorGotten -: -false -get -[ -Symbol -. -asyncIterator -] -( -) -{ -results -. -push -( -" [ Symbol . asyncIterator ] -GETTER -" -) -; -if ( -this -. -asyncIteratorGotten ) { return -null -; -} -this -. -asyncIteratorGotten -= -true -; -return -function -( -) { -} -; -} -[ -Symbol -. -iterator -] +val +: +0 +next ( ) { @@ -5028,29 +5142,19 @@ results . push ( -' -[ -Symbol -. -iterator -] +IteratorRecord +# +next ( ) -invoked -as -fallback -' -) -; -return +pushing { +this +. val -: -0 -next -( +} ) -{ +; return { value @@ -5068,7 +5172,7 @@ val = = = -4 +10 ? true : @@ -5076,54 +5180,67 @@ false } ; } -} -; -} -} -; -const -source -= -Observable -. -from +return ( -async_iterable +reason ) -; -assert_array_equals -( +{ results -[ -" -[ -Symbol . -asyncIterator -] -GETTER -" -] +push +( +IteratorRecord +# +return +( +) +called +with +reason += +{ +reason +} +) +; +return +{ +done +: +true +} +; +} +} +; +} +} +; +const +ac += +new +AbortController +( ) ; await new Promise ( -( resolve -reject -) = > { -source +Observable +. +from +( +iterable +) . subscribe ( -{ -next -: v = > @@ -5138,58 +5255,27 @@ v } ) ; -queueMicrotask -( +if ( -) +v = -> -results -. -push -( -next -( += += +3 ) -microtask -interleaving +{ +ac +. +abort ( +Aborting +because v = { v } ) -) -) -; -} -error -: -e -= -> -reject -( -e -) -complete -: -( -) -= -> -{ -results -. -push -( -' -complete -( -) -' -) ; resolve ( @@ -5197,6 +5283,13 @@ resolve ; } } +{ +signal +: +ac +. +signal +} ) ; } @@ -5207,101 +5300,72 @@ assert_array_equals results [ " -[ -Symbol -. -asyncIterator -] -GETTER -" -" -[ -Symbol -. -asyncIterator -] -GETTER -" -" -[ -Symbol -. -iterator -] +IteratorRecord +# +next ( ) -invoked -as -fallback +pushing +0 " " Observing 0 " " +IteratorRecord +# next ( ) -microtask -interleaving -( -v -= -0 -) +pushing +1 " " Observing 1 " " +IteratorRecord +# next ( ) -microtask -interleaving -( -v -= -1 -) +pushing +2 " " Observing 2 " " +IteratorRecord +# next ( ) -microtask -interleaving -( -v -= -2 -) +pushing +3 " " Observing 3 " " -next +IteratorRecord +# +return ( ) -microtask -interleaving -( +called +with +reason += +Aborting +because v = 3 -) -" -" -complete -( -) " ] ) @@ -5312,13 +5376,25 @@ from ( ) : -Asynchronous -iterable -conversion -with -synchronous +Aborting +async iterable -fallback +midway +through +iteration +both +stops +iteration +" ++ +" +and +invokes +IteratorRecord +# +return +( +) " ) ; @@ -5330,114 +5406,2653 @@ test > { const -results +iterable = +{ [ +Symbol +. +iterator ] -; -let -generatorFinalized -= -false -; -const -generator -= -function -* ( ) { -try +return { -for -( -let -n -= +val +: 0 -; -n -< -10 -; -n -+ -+ +next +( ) { -yield +return +{ +value +: +this +. +val +done +: +this +. +val ++ ++ += += += +10 +? +true +: +false +} +; +} +return +( +reason +) +{ +} +} +; +} +} +; +let +thrownError += +null +; +const +ac += +new +AbortController +( +) +; +Observable +. +from +( +iterable +) +. +subscribe +( +v += +> +{ +if +( +v += += += +3 +) +{ +try +{ +ac +. +abort +( +Aborting +because +v += +{ +v +} +) +; +} +catch +( +e +) +{ +thrownError += +e +; +} +} +} +{ +signal +: +ac +. +signal +} +) +; +assert_not_equals +( +thrownError +null +" +abort +( +) +threw +an +Error +" +) +; +assert_true +( +thrownError +instanceof +TypeError +) +; +assert_true +( +thrownError +. +message +. +includes +( +' +return +( +) +' +) +) +; +assert_true +( +thrownError +. +message +. +includes +( +' +Object +' +) +) +; +} +" +from +( +) +: +Sync +iterable +: +Iterator +# +return +( +) +must +return +an +Object +or +an +" ++ +" +error +is +thrown +" +) +; +promise_test +( +async +t += +> +{ +const +iterable += +{ +[ +Symbol +. +asyncIterator +] +( +) +{ +return +{ +val +: +0 +next +( +) +{ +return +{ +value +: +this +. +val +done +: +this +. +val ++ ++ += += += +10 +? +true +: +false +} +; +} +return +( +reason +) +{ +} +} +; +} +} +; +const +unhandled_rejection_promise += +new +Promise +( +( +resolve +reject +) += +> +{ +const +unhandled_rejection_handler += +e += +> +resolve +( +e +. +reason +) +; +self +. +addEventListener +( +" +unhandledrejection +" +unhandled_rejection_handler +) +; +t +. +add_cleanup +( +( +) += +> +self +. +removeEventListener +( +" +unhandledrejection +" +unhandled_rejection_handler +) +) +; +t +. +step_timeout +( +( +) += +> +reject +( +' +Timeout +' +) +3000 +) +; +} +) +; +const +ac += +new +AbortController +( +) +; +await +new +Promise +( +resolve += +> +{ +Observable +. +from +( +iterable +) +. +subscribe +( +v += +> +{ +if +( +v += += += +3 +) +{ +ac +. +abort +( +Aborting +because +v += +{ +v +} +) +; +resolve +( +) +; +} +} +{ +signal +: +ac +. +signal +} +) +; +} +) +; +const +reason += +await +unhandled_rejection_promise +; +assert_true +( +reason +instanceof +TypeError +) +; +assert_true +( +reason +. +message +. +includes +( +' +return +( +) +' +) +) +; +assert_true +( +reason +. +message +. +includes +( +' +Object +' +) +) +; +} +" +from +( +) +: +Async +iterable +: +Iterator +# +return +( +) +must +return +an +Object +or +a +" ++ +" +Promise +rejects +asynchronously +" +) +; +promise_test +( +async +( +) += +> +{ +const +results += +[ +] +; +const +async_iterable += +{ +asyncIteratorGotten +: +false +get +[ +Symbol +. +asyncIterator +] +( +) +{ +results +. +push +( +" +[ +Symbol +. +asyncIterator +] +GETTER +" +) +; +if +( +this +. +asyncIteratorGotten +) +{ +return +null +; +} +this +. +asyncIteratorGotten += +true +; +return +function +( +) +{ +} +; +} +[ +Symbol +. +iterator +] +( +) +{ +results +. +push +( +' +[ +Symbol +. +iterator +] +( +) +invoked +as +fallback +' +) +; +return +{ +val +: +0 +next +( +) +{ +return +{ +value +: +this +. +val +done +: +this +. +val ++ ++ += += += +4 +? +true +: +false +} +; +} +} +; +} +} +; +const +source += +Observable +. +from +( +async_iterable +) +; +assert_array_equals +( +results +[ +" +[ +Symbol +. +asyncIterator +] +GETTER +" +] +) +; +await +new +Promise +( +( +resolve +reject +) += +> +{ +source +. +subscribe +( +{ +next +: +v += +> +{ +results +. +push +( +Observing +{ +v +} +) +; +queueMicrotask +( +( +) += +> +results +. +push +( +next +( +) +microtask +interleaving +( +v += +{ +v +} +) +) +) +; +} +error +: +e += +> +reject +( +e +) +complete +: +( +) += +> +{ +results +. +push +( +' +complete +( +) +' +) +; +resolve +( +) +; +} +} +) +; +} +) +; +assert_array_equals +( +results +[ +" +[ +Symbol +. +asyncIterator +] +GETTER +" +" +[ +Symbol +. +asyncIterator +] +GETTER +" +" +[ +Symbol +. +iterator +] +( +) +invoked +as +fallback +" +" +Observing +0 +" +" +next +( +) +microtask +interleaving +( +v += +0 +) +" +" +Observing +1 +" +" +next +( +) +microtask +interleaving +( +v += +1 +) +" +" +Observing +2 +" +" +next +( +) +microtask +interleaving +( +v += +2 +) +" +" +Observing +3 +" +" +next +( +) +microtask +interleaving +( +v += +3 +) +" +" +complete +( +) +" +] +) +; +} +" +from +( +) +: +Asynchronous +iterable +conversion +with +synchronous +iterable +fallback +" +) +; +test +( +( +) += +> +{ +const +results += +[ +] +; +let +generatorFinalized += +false +; +const +generator += +function +* +( +) +{ +try +{ +for +( +let +n += +0 +; +n +< +10 +; +n ++ ++ +) +{ +yield +n +; +} +} +finally +{ +generatorFinalized += +true +; +} +} +; +const +observable += +Observable +. +from +( +generator +( +) +) +; +const +abortController += +new +AbortController +( +) +; +observable +. +subscribe +( +n += +> +{ +results +. +push +( +n +) +; +if +( +n += += += +3 +) +{ +abortController +. +abort +( +) +; +} +} +{ +signal +: +abortController +. +signal +} +) +; +assert_array_equals +( +results +[ +0 +1 +2 +3 +] +) +; +assert_true +( +generatorFinalized +) +; +} +" +from +( +) +: +Generator +finally +block +runs +when +subscription +is +aborted +" +) +; +test +( +( +) += +> +{ +const +results += +[ +] +; +let +generatorFinalized += +false +; +const +generator += +function +* +( +) +{ +try +{ +for +( +let +n += +0 +; +n +< +10 +; +n ++ ++ +) +{ +yield +n +; +} +} +catch +{ +assert_unreached +( +" +generator +should +not +be +aborted +" +) +; +} +finally +{ +generatorFinalized += +true +; +} +} +; +const +observable += +Observable +. +from +( +generator +( +) +) +; +observable +. +subscribe +( +( +n +) += +> +{ +results +. +push +( +n +) +; +} +) +; +assert_array_equals +( +results +[ +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +] +) +; +assert_true +( +generatorFinalized +) +; +} +" +from +( +) +: +Generator +finally +block +run +when +Observable +completes +" +) +; +test +( +( +) += +> +{ +const +results += +[ +] +; +let +generatorFinalized += +false +; +const +generator += +function +* +( +) +{ +try +{ +for +( +let +n += +0 +; +n +< +10 +; +n ++ ++ +) +{ +yield +n +; +} +throw +new +Error +( +' +from +the +generator +' +) +; +} +finally +{ +generatorFinalized += +true +; +} +} +; +const +observable += +Observable +. +from +( +generator +( +) +) +; +observable +. +subscribe +( +{ +next +: +n += +> +results +. +push +( +n +) +error +: +e += +> +results +. +push +( +e +. +message +) +} +) +; +assert_array_equals +( +results +[ +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +" +from +the +generator +" +] +) +; +assert_true +( +generatorFinalized +) +; +} +" +from +( +) +: +Generator +finally +block +run +when +Observable +errors +" +) +; +promise_test +( +async +t += +> +{ +const +results += +[ +] +; +let +generatorFinalized += +false +; +async +function +* +asyncGenerator +( +) +{ +try +{ +for +( +let +n += +0 +; +n +< +10 +; +n ++ ++ +) +{ +yield +n +; +} +} +finally +{ +generatorFinalized += +true +; +} +} +const +observable += +Observable +. +from +( +asyncGenerator +( +) +) +; +const +abortController += +new +AbortController +( +) +; +await +new +Promise +( +( +resolve +) += +> +{ +observable +. +subscribe +( +( +n +) += +> +{ +results +. +push +( +n +) +; +if +( +n += += += +3 +) +{ +abortController +. +abort +( +) +; +resolve +( +) +; +} +} +{ +signal +: +abortController +. +signal +} +) +; +} +) +; +assert_array_equals +( +results +[ +0 +1 +2 +3 +] +) +; +assert_true +( +generatorFinalized +) +; +} +" +from +( +) +: +Async +generator +finally +block +run +when +subscription +is +aborted +" +) +; +promise_test +( +async +t += +> +{ +const +results += +[ +] +; +let +generatorFinalized += +false +; +async +function +* +asyncGenerator +( +) +{ +try +{ +for +( +let +n += +0 +; +n +< +10 +; +n ++ ++ +) +{ +yield +n +; +} +} +finally +{ +generatorFinalized += +true +; +} +} +const +observable += +Observable +. +from +( +asyncGenerator +( +) +) +; +await +new +Promise +( +resolve += +> +{ +observable +. +subscribe +( +{ +next +: +n += +> +results +. +push +( +n +) +complete +: +( +) += +> +resolve +( +) +} +) +; +} +) +; +assert_array_equals +( +results +[ +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +] +) +; +assert_true +( +generatorFinalized +) +; +} +" +from +( +) +: +Async +generator +finally +block +runs +when +Observable +completes +" +) +; +promise_test +( +async +t += +> +{ +const +results += +[ +] +; +let +generatorFinalized += +false +; +async +function +* +asyncGenerator +( +) +{ +try +{ +for +( +let +n += +0 +; +n +< +10 +; +n ++ ++ +) +{ +if +( +n += += += +4 +) +{ +throw +new +Error +( +' +from +the +async +generator +' +) +; +} +yield +n +; +} +} +finally +{ +generatorFinalized += +true +; +} +} +const +observable += +Observable +. +from +( +asyncGenerator +( +) +) +; +await +new +Promise +( +( +resolve +) += +> +{ +observable +. +subscribe +( +{ +next +: +( +n +) += +> +results +. +push +( n +) +error +: +( +e +) += +> +{ +results +. +push +( +e +. +message +) +; +resolve +( +) +; +} +} +) +; +} +) +; +assert_array_equals +( +results +[ +0 +1 +2 +3 +" +from +the +async +generator +" +] +) +; +assert_true +( +generatorFinalized +) +; +} +" +from +( +) +: +Async +generator +finally +block +run +when +Observable +errors +" +) +; +test +( +( +) += +> +{ +const +results += +[ +] +; +const +iterable += +{ +[ +Symbol +. +iterator +] +( +) +{ +return +{ +val +: +0 +next +( +) +{ +results +. +push +( +' +next +( +) +called +' +) +; +return +{ +value +: +this +. +val +done +: +this +. +val ++ ++ += += += +10 +? +true +: +false +} +; +} +return +( +) +{ +results +. +push +( +' +return +( +) +about +to +throw +an +error +' +) +; +throw +new +Error +( +' +return +( +) +error +' +) +; +} +} +; +} +} +; +const +ac += +new +AbortController +( +) +; +const +source += +Observable +. +from +( +iterable +) +; +source +. +subscribe +( +v += +> +{ +if +( +v += += += +3 +) +{ +try +{ +ac +. +abort +( +) +; +} +catch +( +e +) +{ +results +. +push +( +AbortController +# +abort +( +) +threw +an +error +: +{ +e +. +message +} +) +; +} +} +} +{ +signal +: +ac +. +signal +} +) +; +assert_array_equals +( +results +[ +' +next +( +) +called +' +' +next +( +) +called +' +' +next +( +) +called +' +' +next +( +) +called +' +' +return +( +) +about +to +throw +an +error +' +' +AbortController +# +abort +( +) +threw +an +error +: +return +( +) +error +' +] +) +; +} +" +from +( +) +: +Sync +iterable +: +error +thrown +from +IteratorRecord +# +return +( +) +can +be +" ++ +" +synchronously +caught +" +) +; +promise_test +( +async +t += +> +{ +const +results += +[ +] +; +const +iterable += +{ +[ +Symbol +. +asyncIterator +] +( +) +{ +return +{ +val +: +0 +next +( +) +{ +results +. +push +( +' +next +( +) +called +' +) +; +return +{ +value +: +this +. +val +done +: +this +. +val ++ ++ += += += +10 +? +true +: +false +} +; +} +return +( +) +{ +results +. +push +( +' +return +( +) +about +to +throw +an +error +' +) +; +throw +new +Error +( +' +return +( +) +error +' +) +; +} +} +; +} +} +; +const +unhandled_rejection_promise += +new +Promise +( +( +resolve +reject +) += +> +{ +const +unhandled_rejection_handler += +e += +> +resolve +( +e +. +reason +) +; +self +. +addEventListener +( +" +unhandledrejection +" +unhandled_rejection_handler +) +; +t +. +add_cleanup +( +( +) += +> +self +. +removeEventListener +( +" +unhandledrejection +" +unhandled_rejection_handler +) +) +; +t +. +step_timeout +( +( +) += +> +reject +( +' +Timeout +' +) +1500 +) +; +} +) +; +const +ac += +new +AbortController +( +) +; +const +source += +Observable +. +from +( +iterable +) +; +await +new +Promise +( +( +resolve +reject +) += +> +{ +source +. +subscribe +( +v += +> +{ +if +( +v += += += +3 +) +{ +try +{ +ac +. +abort +( +) +; +results +. +push +( +' +No +error +thrown +synchronously +' +) +; +resolve +( +' +No +error +thrown +synchronously +' +) +; +} +catch +( +e +) +{ +results +. +push +( +AbortController +# +abort +( +) +threw +an +error +: +{ +e +. +message +} +) +; +reject +( +e +) +; +} +} +} +{ +signal +: +ac +. +signal +} +) +; +} +) +; +assert_array_equals +( +results +[ +' +next +( +) +called +' +' +next +( +) +called +' +' +next +( +) +called +' +' +next +( +) +called +' +' +return +( +) +about +to +throw +an +error +' +' +No +error +thrown +synchronously +' +] +) +; +const +reason += +await +unhandled_rejection_promise +; +assert_true +( +reason +instanceof +Error +) +; +assert_equals +( +reason +. +message +" +return +( +) +error +" +" +Custom +error +text +passed +through +rejected +Promise +" +) ; } -} -finally +" +from +( +) +: +Async +iterable +: +error +thrown +from +IteratorRecord +# +return +( +) +is +" ++ +" +wrapped +in +rejected +Promise +" +) +; +test +( +( +) += +> { -generatorFinalized +const +results = -true -; -} -} +[ +] ; const -observable +iterable = -Observable +{ +impl +( +) +{ +return +{ +next +( +) +{ +results . -from +push ( -generator +' +next ( ) +running +' ) ; +return +{ +done +: +true +} +; +} +} +; +} +} +; +iterable +[ +Symbol +. +iterator +] += +iterable +. +impl +; +{ const -abortController +source = -new -AbortController +Observable +. +from ( +iterable ) ; -observable +source . subscribe ( -n -= -> { -results +} +{ +signal +: +AbortSignal . -push +abort ( -n +) +} ) ; -if +assert_array_equals ( -n -= +results +[ +] +) +; +} +iterable +[ +Symbol +. +iterator +] = +undefined +; +iterable +[ +Symbol +. +asyncIterator +] = -3 -) +iterable +. +impl +; { -abortController +const +source += +Observable . -abort +from ( +iterable ) ; -} +source +. +subscribe +( +{ } { signal : -abortController +AbortSignal . -signal +abort +( +) } ) ; @@ -5445,32 +8060,34 @@ assert_array_equals ( results [ -0 -1 -2 -3 ] ) ; -assert_true -( -generatorFinalized -) -; +} } " from ( ) : -Generator -finally -block -runs -when -subscription -is +Subscribing +to +an +iterable +Observable +with +an aborted +signal +" ++ +" +does +not +call +next +( +) " ) ; @@ -5487,94 +8104,130 @@ results [ ] ; -let -generatorFinalized +const +ac = -false +new +AbortController +( +) ; const -generator +iterable = -function -* +{ +[ +Symbol +. +iterator +] ( ) { -try -{ -for +ac +. +abort ( -let -n -= -0 -; -n -< -10 +) ; -n -+ -+ +return +{ +val +: +0 +next +( ) { -yield -n +results +. +push +( +' +next +( +) +called +' +) ; +return +{ +done +: +true } +; } -catch +return +( +) { -assert_unreached +results +. +push +( +' +return ( -" -generator -should -not -be -aborted -" +) +called +' ) ; } -finally -{ -generatorFinalized -= -true +} ; } } ; const -observable +source = Observable . from ( -generator -( -) +iterable ) ; -observable +source . subscribe ( +{ +next +: +v += +> +results +. +push +( +v +) +complete +: ( -n ) = > -{ results . push ( -n +' +complete +' ) -; +} +{ +signal +: +ac +. +signal } ) ; @@ -5582,37 +8235,30 @@ assert_array_equals ( results [ -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 ] ) ; -assert_true -( -generatorFinalized -) -; } " from ( ) : -Generator -finally -block -run -when -Observable -completes +When +iterable +conversion +aborts +the +subscription +next +( +) +is +" ++ +" +never +called " ) ; @@ -5629,153 +8275,170 @@ results [ ] ; -let -generatorFinalized +const +ac = -false +new +AbortController +( +) ; const -generator +iterable = -function -* +{ +[ +Symbol +. +asyncIterator +] ( ) { -try -{ -for +ac +. +abort ( -let -n -= -0 -; -n -< -10 +) ; -n -+ -+ +return +{ +val +: +0 +next +( ) { -yield -n +results +. +push +( +' +next +( +) +called +' +) +; +return +{ +done +: +true +} ; } -throw -new -Error +return +( +) +{ +results +. +push ( ' -from -the -generator +return +( +) +called ' ) ; } -finally -{ -generatorFinalized -= -true +} ; } } ; const -observable +source = Observable . from ( -generator -( -) +iterable ) ; -observable +source . subscribe ( { next : -n +v = > results . push ( -n +v ) -error +complete : -e +( +) = > results . push ( -e -. -message +' +complete +' ) } +{ +signal +: +ac +. +signal +} ) ; assert_array_equals ( results [ -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -" -from -the -generator -" ] ) ; -assert_true -( -generatorFinalized -) -; } " from ( ) : -Generator -finally -block -run -when -Observable -errors +When +async +iterable +conversion +aborts +the +subscription +next +( +) +" ++ +" +is +never +called " ) ; promise_test ( async -t +( +) = > { @@ -5786,263 +8449,210 @@ results ] ; let -generatorFinalized +resolveNext = -false +null ; -async -function -* -asyncGenerator +const +iterable += +{ +[ +Symbol +. +asyncIterator +] ( ) { -try +return { -for +next ( -let -n -= -0 -; -n -< -10 -; -n -+ -+ ) { -yield -n +results +. +push +( +' +next +( +) +called +' +) ; -} -} -finally +return +new +Promise +( +resolve += +> { -generatorFinalized +resolveNext = -true +resolve ; } +) +; } -const -observable -= -Observable +return +( +) +{ +results . -from +push ( -asyncGenerator +' +return ( ) +called +' ) ; +} +} +; +} +} +; const -abortController +ac = new AbortController ( ) ; -await -new -Promise -( +const +source += +Observable +. +from ( -resolve +iterable ) -= -> -{ -observable +; +source . subscribe ( -( -n -) +{ +next +: +v = > -{ results . push ( -n +v ) -; -if +complete +: ( -n -= -= -= -3 ) -{ -abortController += +> +results . -abort -( -) -; -resolve +push ( +' +complete +' ) -; -} } { signal : -abortController +ac . signal } ) ; -} -) -; assert_array_equals ( results [ -0 -1 -2 -3 -] -) -; -assert_true -( -generatorFinalized -) -; -} " -from +next ( ) -: -Async -generator -finally -block -run -when -subscription -is -aborted +called " +] ) ; -promise_test +ac +. +abort ( -async -t -= -> -{ -const -results -= -[ -] -; -let -generatorFinalized -= -false +) ; -async -function -* -asyncGenerator +assert_array_equals ( -) -{ -try -{ -for +results +[ +" +next ( -let -n -= -0 -; -n -< -10 -; -n -+ -+ ) -{ -yield -n -; -} -} -finally -{ -generatorFinalized -= -true -; -} -} -const -observable -= -Observable -. -from -( -asyncGenerator +called +" +" +return ( ) +called +" +] ) ; await new Promise ( -resolve +resolveOuter = > { -observable -. -subscribe +resolveNext +( +{ +get +done ( +) { -next -: -n -= -> results . push ( -n -) -complete -: -( +' +IteratorResult +. +done +GETTER +' ) -= -> -resolve +; +resolveOuter ( ) +; +return +true +; +} } ) ; @@ -6053,22 +8663,25 @@ assert_array_equals ( results [ -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -] +" +next +( ) -; -assert_true +called +" +" +return ( -generatorFinalized +) +called +" +" +IteratorResult +. +done +GETTER +" +] ) ; } @@ -6077,21 +8690,38 @@ from ( ) : -Async -generator -finally -block -runs -when -Observable -completes +Aborting +an +async +iterable +subscription +stops +subsequent +next +( +) +" ++ +" +calls +but +old +next +( +) +Promise +reactions +are +web +- +observable " ) ; -promise_test +test ( -async -t +( +) = > { @@ -6101,137 +8731,136 @@ results [ ] ; -let -generatorFinalized +const +iterable = -false -; -async -function -* -asyncGenerator +{ +[ +Symbol +. +iterator +] ( ) { -try +return { -for -( -let -n -= +val +: 0 -; -n -< -10 -; -n -+ -+ +next +( ) { -if -( -n +return +{ +value +: +this +. +val +done +: +this +. +val ++ ++ = = = 4 +? +true +: +false +} +; +} +return +( ) { -throw -new -Error +results +. +push ( ' -from -the -async -generator +return +( +) +called ' ) ; } -yield -n -; -} } -finally -{ -generatorFinalized -= -true ; } } +; const -observable +source = Observable . from ( -asyncGenerator -( -) +iterable ) ; -await +const +ac += new -Promise -( +AbortController ( -resolve ) -= -> -{ -observable +; +source . subscribe ( { next : -( -n -) +v = > results . push ( -n +v ) -error +complete : ( -e ) = > -{ results . push ( -e -. -message -) -; -resolve -( +' +complete +' ) -; } +{ +signal +: +ac +. +signal } ) ; -} +ac +. +abort +( ) ; assert_array_equals @@ -6242,34 +8871,29 @@ results 1 2 3 -" -from -the -async -generator -" +' +complete +' ] ) ; -assert_true -( -generatorFinalized -) -; } " from ( ) : -Async -generator -finally -block -run -when -Observable -errors +Abort +after +complete +does +NOT +call +IteratorRecord +# +return +( +) " ) ;