Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

wrong oder of execution of async #683

Closed
ivanitskiy opened this issue Nov 20, 2023 · 4 comments
Closed

wrong oder of execution of async #683

ivanitskiy opened this issue Nov 20, 2023 · 4 comments

Comments

@ivanitskiy
Copy link

ivanitskiy commented Nov 20, 2023

I was reading this blog: https://v8.dev/blog/fast-async and here is the code they tested:
node

NJS seems to fall into wrong order of execution:

test.js

if (typeof console === "undefined") {
    global.console = {
        log: function(msg) { ngx.log(ngx.INFO, msg); },
        error: function(msg) { ngx.log(ngx.ERR, msg); },
        warn: function(msg) { ngx.log(ngx.WARN, msg); },
        info: function(msg) { ngx.log(ngx.INFO, msg); },
        debug: function(msg) { ngx.log(ngx.DEBUG, msg); },
    };
}

function hello_world(_r) {
    const p = Promise.resolve();
    (async () => {
        await p;
        console.error('after:await');
    }
    )();
    p.then(() => console.error('after:then'))
        .then(() => console.error('after:then2'));
    return "bar"
}

export default {
    hello_world
}
    server {
        listen 8001;
        js_import test from js/njs.js;
        js_set $js_foo test.hello_world;
        location / {
            return 200 $js_foo;
        }
    }

in the log I see:


2023/11/20 19:03:00 [error] 1#1: *1 js: after:await
2023/11/20 19:03:00 [error] 1#1: *1 js: after:then
2023/11/20 19:03:00 [error] 1#1: *1 js: after:then2

@xeioex xeioex added the bug label Nov 20, 2023
@ivanitskiy
Copy link
Author

Chrome 119.0.6045.159:
image

@drsm
Copy link
Contributor

drsm commented Nov 21, 2023

@ivanitskiy

It's not a bug BTW, 'cause they have fixed the spec.
So now we have a correct order.

@ivanitskiy
Copy link
Author

ivanitskiy commented Nov 21, 2023

➜  ~ node
Welcome to Node.js v16.15.1.
Type ".help" for more information.
> function hello_world(_r) {
...     const p = Promise.resolve();
...     (async () => {
.....         await p;
.....         console.error('after:await');
.....     }
.....     )();
...     p.then(() => console.error('after:then'))
...         .then(() => console.error('after:then2'));
...     return "bar"
... }
undefined
> hello_world()
'bar'
> after:await
after:then
after:then2

{
  node: '16.15.1',
  v8: '9.4.146.24-node.21',
  uv: '1.43.0',
  zlib: '1.2.11',
  brotli: '1.0.9',
  ares: '1.18.1',
  modules: '93',
  nghttp2: '1.47.0',
  napi: '8',
  llhttp: '6.0.4',
  openssl: '1.1.1o+quic',
  cldr: '40.0',
  icu: '70.1',
  tz: '2021a3',
  unicode: '14.0',
  ngtcp2: '0.1.0-DEV',
  nghttp3: '0.1.0-DEV'
}

@ivanitskiy
Copy link
Author

Welcome to Node.js v21.2.0.
Type ".help" for more information.
> function hello_world(_r) {
...     const p = Promise.resolve();
...     (async () => {
...         await p;
...         console.error('after:await');
...     }
...     )();
...     p.then(() => console.error('after:then'))
...         .then(() => console.error('after:then2'));
...     return "bar"
... }
undefined
> hello_world()
'bar'
> after:await
after:then
after:then2

> process.versions
{
  node: '21.2.0',
  acorn: '8.11.2',
  ada: '2.7.2',
  ares: '1.20.1',
  base64: '0.5.1',
  brotli: '1.0.9',
  cjs_module_lexer: '1.2.2',
  cldr: '43.1',
  icu: '73.2',
  llhttp: '9.1.3',
  modules: '120',
  napi: '9',
  nghttp2: '1.58.0',
  nghttp3: '0.7.0',
  ngtcp2: '0.8.1',
  openssl: '3.0.12+quic',
  simdutf: '3.2.18',
  tz: '2023c',
  undici: '5.27.0',
  unicode: '15.0',
  uv: '1.46.0',
  uvwasi: '0.0.19',
  v8: '11.8.172.17-node.15',
  zlib: '1.2.13.1-motley-dfc48fc'
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants