From c4768bc0e6f8d8150ea155a4b1119aec876593bd Mon Sep 17 00:00:00 2001 From: Dmitry Vasilev Date: Tue, 17 Jan 2023 17:27:31 +0800 Subject: [PATCH] set status in Promise.then --- src/eval.js | 10 +++++++--- test/test.js | 27 +++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/src/eval.js b/src/eval.js index 21ae51c..eacd534 100644 --- a/src/eval.js +++ b/src/eval.js @@ -298,14 +298,18 @@ export const eval_modules = ( promise_then = Promise.prototype.then Promise.prototype.then = function then(on_resolve, on_reject) { + if(children == null) { children = [] } let children_copy = children - const make_callback = cb => typeof(cb) != 'function' + const make_callback = (cb, ok) => typeof(cb) != 'function' ? cb : value => { + if(this.status == null) { + this.status = ok ? {ok, value} : {ok, error: value} + } const current = children children = children_copy try { @@ -317,8 +321,8 @@ export const eval_modules = ( return promise_then.call( this, - make_callback(on_resolve), - make_callback(on_reject), + make_callback(on_resolve, true), + make_callback(on_reject, false), ) } } diff --git a/test/test.js b/test/test.js index 0583bda..65f2688 100644 --- a/test/test.js +++ b/test/test.js @@ -2749,6 +2749,33 @@ const y = x()` assert_equal(call_delay.fn.name, 'delay') }), + test('async/await Promise.all set child promises status ok', async () => { + const i = await test_initial_state_async(` + const async_fn = async () => 1 + await Promise.all([1,2,3].map(async_fn)) + `) + const async_fn_call = + root_calltree_node(i) + .children[0] // map + .children[0] // first call of async_fn + assert_equal(async_fn_call.value.status.ok, true) + assert_equal(async_fn_call.value.status.value, 1) + }), + + test('async/await Promise.all set child promises status error', + async () => { + const i = await test_initial_state_async(` + const async_fn = async () => { throw 1 } + await Promise.all([1,2,3].map(async_fn)) + `) + const async_fn_call = + root_calltree_node(i) + .children[0] // map + .children[0] // first call of async_fn + assert_equal(async_fn_call.value.status.ok, false) + assert_equal(async_fn_call.value.status.error, 1) + }), + test('async/await logs out of order', async () => { const i = await test_initial_state_async(` // Init promises p1 and p2 that are resolved in different order (p2 then