Home > Net >  How can variable be used in promise chaining before declaration?
How can variable be used in promise chaining before declaration?

Time:03-28

I came across the following code while working with promises. And it works correctly.

I have read shallowly on how async/await code is run on node. But, in the following code, how is the session variable accessible inside the .then() function? Is it just by sheer chance that this code works or is there something about how node runs async/await code that makes the session variable available inside the .then() function?

async function asyncFunction(
  cb: (filePath: string, session: Session) => Promise<any>,
) {
    readFile().then(filePath => cb(filePath, session));
    const session = await verifyToken();
}

CodePudding user response:

Is it just by sheer chance that this code works?

Yes. If verifyToken takes longer than readFile, session will not be initialised when the .then() callback runs and you'll get an exception.

The proper solution for this problem is Promise.all, and not using a callback:

async function asyncFunction(): Promise<[filePath: string, session: Session]> {
    return Promise.all([readFile(), verifyToken()]);
}

CodePudding user response:

This is a perfect example of variable scope. In your case this is a sheer chance that this code works. Since the readFile takes longer than verifyToken. As a result, the session variable is initiated before getting callback in then function.

In case the verifyToken takes longer that readFile (even just by a milli-second), then it would throw Cannot access variable before initialization Error.

  • Related