Skip to content

async_hooks: not able to preserve continuation local storage inside Promises #13583

@gms1

Description

@gms1

Hi,

maybe related to: (#13367),
the init-hook (now?) reports a triggerId of 0 for type 'PROMISE' sometimes

code to reproduce:

const asyncHooks = require('async_hooks');

let beforeId;
asyncHooks
    .createHook({
    init: (id, type, triggerId) => {
        process._rawDebug(`init: id:${id} type:${type} triggerId:${triggerId}`);
    },
    before: (id) => {
        process._rawDebug(`before: id:${id}`);
        beforeId = id;
    }
})
    .enable();

function tracePromise(prefix) {
    process._rawDebug(`promise : ${prefix}: currId:${asyncHooks.currentId()} lastId:${beforeId}`);
}

setImmediate(() => {
    doTrace = true;
    return new Promise((resolve, reject) => {
        tracePromise('P1: EXECUTOR FUNC');
        resolve();
    })
        .then(() => {
        tracePromise('P1: THEN');
        return new Promise((resolve, reject) => {
            tracePromise('P2: EXECUTOR FUNC');
            resolve();
        })
            .then(() => {
            tracePromise('P2: THEN');
            return new Promise((resolve, reject) => {
                tracePromise('P3: EXECUTOR FUNC');
                resolve();
            })
                .then(() => {
                tracePromise('P3: THEN');
            });
        });
    });
});

output from above:

gms@sirius:~/work/HOT/node-async-context/test (master)$ node promise.js 
init: id:2 type:Immediate triggerId:1
before: id:2
init: id:3 type:PROMISE triggerId:2
promise : P1: EXECUTOR FUNC: currId:2 lastId:2
init: id:4 type:PROMISE triggerId:3
before: id:4
promise : P1: THEN: currId:0 lastId:4
init: id:5 type:PROMISE triggerId:0
promise : P2: EXECUTOR FUNC: currId:0 lastId:4
init: id:6 type:PROMISE triggerId:5
before: id:6
promise : P2: THEN: currId:0 lastId:6
init: id:7 type:PROMISE triggerId:0
promise : P3: EXECUTOR FUNC: currId:0 lastId:6
init: id:8 type:PROMISE triggerId:7
init: id:9 type:PROMISE triggerId:6
before: id:8
promise : P3: THEN: currId:0 lastId:8
init: id:10 type:PROMISE triggerId:8
before: id:10
before: id:9

Guenter

Metadata

Metadata

Assignees

No one assigned

    Labels

    async_hooksIssues and PRs related to the async hooks subsystem.promisesIssues and PRs related to ECMAScript promises.

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions