Search code examples
es6-promise

Passing Promise to first argument of `.then`


My question is: Is it okay to pass a promise to the first argument of .then? (Assuming that I'm not interested in the returned value of the previous promise and I just want to chain promises together).

Someone told me that if I do this, a new promise will be created implicitly (unnecessarily), and I might face issues handling errors bellow in the promise chain.

I know that if you don't explicitly return a promise in an async method the result will be implicitly wrapped. In this case, .then should not wrap the argument in a promise since the argument is already a promise :/

Example:

async function asyncFunc() {
  //async function (return Promise)
}

// I know this is okay
somePromise.then(() => asyncFunc());

// BUT... is this okay?
somePromise.then(asyncFunc());


Solution

  • Is it okay to pass a promise to the first argument of .then?

    Yes.

    Someone told me that if I do this, a new promise will be created implicitly (unnecessarily)

    Promise.prototype.then() returns a new promise either way.

    // BUT... is this okay?
    somePromise.then(asyncFunc());
    

    No, it is more or less the same as:

    const p = asyncFunc()
    somePromise.then(p);
    

    You execute the function before somePromise actually resolves. What you probably want instead is somePromise.then(asyncFunction). This will properly chain the promises after each other.

    Someone told me that [...] I might face issues handling errors bellow in the promise chain.

    No. This does not change the behaviour of the promise chain as long as long as there is a catch at the end of the chain.