Get value of resolved Promise in sync

10,901

Solution 1

No, it is not possible to do this. This is by design.

The Promise A+ specification is meant to be used as a simple, consistent way to deal with asynchronous operations. One of the constraints is that passing a new callback on to then() on an already resolved promise will always execute on a later tick in the event loop, so things are consistent.

Adding a secondary way to inspect promise results would not have been impossible. It would probably have been quite easy to do so, but there's at least 2 problems with adding this to the specification:

  1. If you're looking to build a specification, you want it to be as simple as possible. The specification itself actually only defines the then() function.
  2. By adding this feature, you're opening the door to hordes of developers getting even more confused about something that's already hard to grok.

Promises and asynchronous operations are hard for people to understand. I see questions here daily about promises and not 'getting' it. If non-async way to access promise results would be added to the default promise, I'd imagine that this would be an even larger amount. It's good to try and enforce 'the right way' of doing things.

However, this decision is not simply made for you. You're not stuck there. You can very easily build your own version of a promise that has this feature, and still works with existing promises. As long as your object has a then() function that behaves according to Promises/A+ you can do with the rest of the object whatever you want.

Solution 2

Promises are always asynchronous in JS.

If you're confident that promise is going to resolve then you can access it with .then method.

a.then(function(value) {
    console.log("First");
    console.log(value);
    console.log("Last");
    // expected output: 123
});

Variable a will lookalike below if it is console.log

Promise {<resolved>: 123}
    __proto__: Promise
    [[PromiseStatus]]: "resolved"
    [[PromiseValue]]: 123

For error handling, you can error block as mentioned in MDN docs.

Share:
10,901
Lucien
Author by

Lucien

Updated on June 20, 2022

Comments

  • Lucien
    Lucien over 1 year

    If we know that a Promise is definitely resolved, how can we access the value and if we can't, why not?

    let a = Promise.resolve(123);
    
    console.log(a.value); // ???
    

    The following does not work- it prints "First, Last, 123"

    console.log("First");
    Promise.resolve(123).then(console.log);
    console.log("Last");
    

    I'm asking how to get the value of an already resolved Promise synchronously and if that's not possible, why not?

  • Lucien
    Lucien almost 5 years
    Thanks but that's also not in sync
  • Lucien
    Lucien almost 5 years
    Thanks but that's also not in sync
  • Varit J Patel
    Varit J Patel almost 5 years
    As mentioned Promises are async in JS. you can not change the behavior of js to get it in sync. About why it is mentioned under mdn docs.
  • Zoltán Jére
    Zoltán Jére almost 5 years
    Yes because the value the method return is a Promise (as the MDN docs says). The promise itself is async which means you cannot get the value synchronously.