What is an unhandled promise rejection? What is an unhandled promise rejection? angular angular

What is an unhandled promise rejection?


The origin of this error lies in the fact that each and every promise is expected to handle promise rejection i.e. have a .catch(...) . you can avoid the same by adding .catch(...) to a promise in the code as given below.

for example, the function PTest() will either resolve or reject a promise based on the value of a global variable somevar

var somevar = false;var PTest = function () {    return new Promise(function (resolve, reject) {        if (somevar === true)            resolve();        else            reject();    });}var myfunc = PTest();myfunc.then(function () {     console.log("Promise Resolved");}).catch(function () {     console.log("Promise Rejected");});

In some cases, the "unhandled promise rejection" message comes even if we have .catch(..) written for promises. It's all about how you write your code. The following code will generate "unhandled promise rejection" even though we are handling catch.

var somevar = false;var PTest = function () {    return new Promise(function (resolve, reject) {        if (somevar === true)            resolve();        else            reject();    });}var myfunc = PTest();myfunc.then(function () {     console.log("Promise Resolved");});// See the Difference heremyfunc.catch(function () {     console.log("Promise Rejected");});

The difference is that you don't handle .catch(...) as chain but as separate. For some reason JavaScript engine treats it as promise without un-handled promise rejection.


This is when a Promise is completed with .reject() or an exception was thrown in an async executed code and no .catch() did handle the rejection.

A rejected promise is like an exception that bubbles up towards the application entry point and causes the root error handler to produce that output.

See also


Promises can be "handled" after they are rejected. That is, one can call a promise's reject callback before providing a catch handler. This behavior is a little bothersome to me because one can write...

var promise = new Promise(function(resolve) {kjjdjf(); // this function does not exist });

... and in this case, the Promise is rejected silently. If one forgets to add a catch handler, code will continue to silently run without errors. This could lead to lingering and hard-to-find bugs.

In the case of Node.js, there is talk of handling these unhandled Promise rejections and reporting the problems. This brings me to ES7 async/await. Consider this example:

async function getReadyForBed() {  let teethPromise = brushTeeth();  let tempPromise = getRoomTemperature();  // Change clothes based on room temperature  let temp = await tempPromise;  // Assume `changeClothes` also returns a Promise  if(temp > 20) {    await changeClothes("warm");  } else {    await changeClothes("cold");  }  await teethPromise;}

In the example above, suppose teethPromise was rejected (Error: out of toothpaste!) before getRoomTemperature was fulfilled. In this case, there would be an unhandled Promise rejection until await teethPromise.

My point is this... if we consider unhandled Promise rejections to be a problem, Promises that are later handled by an await might get inadvertently reported as bugs. Then again, if we consider unhandled Promise rejections to not be problematic, legitimate bugs might not get reported.

Thoughts on this?

This is related to the discussion found in the Node.js project here:

Default Unhandled Rejection Detection Behavior

if you write the code this way:

function getReadyForBed() {  let teethPromise = brushTeeth();  let tempPromise = getRoomTemperature();  // Change clothes based on room temperature  return Promise.resolve(tempPromise)    .then(temp => {      // Assume `changeClothes` also returns a Promise      if (temp > 20) {        return Promise.resolve(changeClothes("warm"));      } else {        return Promise.resolve(changeClothes("cold"));      }    })    .then(teethPromise)    .then(Promise.resolve()); // since the async function returns nothing, ensure it's a resolved promise for `undefined`, unless it's previously rejected}

When getReadyForBed is invoked, it will synchronously create the final (not returned) promise - which will have the same "unhandled rejection" error as any other promise (could be nothing, of course, depending on the engine). (I find it very odd your function doesn't return anything, which means your async function produces a promise for undefined.

If I make a Promise right now without a catch, and add one later, most "unhandled rejection error" implementations will actually retract the warning when i do later handle it. In other words, async/await doesn't alter the "unhandled rejection" discussion in any way that I can see.

to avoid this pitfall please write the code this way:

async function getReadyForBed() {  let teethPromise = brushTeeth();  let tempPromise = getRoomTemperature();  // Change clothes based on room temperature  var clothesPromise = tempPromise.then(function(temp) {    // Assume `changeClothes` also returns a Promise    if(temp > 20) {      return changeClothes("warm");    } else {      return changeClothes("cold");    }  });  /* Note that clothesPromise resolves to the result of `changeClothes`     due to Promise "chaining" magic. */  // Combine promises and await them both  await Promise.all(teethPromise, clothesPromise);}

Note that this should prevent any unhandled promise rejection.