Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

When should I reject a promise?

Tags:

I'm writing some JS code that uses promises. For example, I open a form pop-up and I return a jQuery Deferred object. It works like this:

  • If the user clicks OK on the form, and it validates, the Deferred resolves to an object representing the form data.

  • If the user clicks Cancel, then the Deferred resolves to a null.

What I'm trying to decide is should the Deferred instead reject, instead of resolve? More generally, I'm wondering when should I resolve to something like a null object, and when should I reject?

Here's some code demonstrating the two positions:

// Resolve with null. var promise = form.open()     .done(function (result) {         if (result) {             // Do something with result.         } else {             // Log lack of result.         }     });  // Reject. var promise = form.open()     .done(function (result) {                     // Do something with result.                 })     .fail(function () {         // Log lack of result.     }); 
like image 881
cdmckay Avatar asked Feb 12 '13 20:02

cdmckay


People also ask

Do I need to return after rejecting a promise?

The reject function of a Promise executor changes the state of the Promise , but does not stop the executor. In general, it is recommended to add a return statement after the reject to stop unintended code execution.

How do you reject a promise then?

then(function(modifiedResource) { if (! isValid(modifiedResource)) { var validationError = getValidationError(modifiedResource); // fail promise with validationError } }) . catch(function() { // oh noes }); There's no longer a reference to the original resolve/reject function or the PromiseResolver.

What does reject in promise do?

The Promise. reject() method returns a Promise object that is rejected with a given reason.

Can a promise resolve and reject?

A Promise that is resolved with the given value, or the promise passed as value, if the value was a promise object. It may be either fulfilled or rejected — for example, resolving a rejected promise will still result in a rejected promise.


2 Answers

The semantics of your two strategies are not really the same. Explicitly rejecting a deferred is meaningful.

For instance, $.when() will keep accumulating results as long as the deferred objects it is passed succeed, but will bail out at the first one which fails.

It means that, if we rename your two promises promise1 and promise2 respectively:

$.when(promise1, promise2).then(function() {     // Success... }, function() {     // Failure... }); 

The code above will wait until the second form is closed, even if the first form is canceled, before invoking one of the callbacks passed to then(). The invoked callback (success or failure) will only depend on the result of the second form.

However, that code will not wait for the first form to be closed before invoking the failure callback if the second form is canceled.

like image 164
Frédéric Hamidi Avatar answered Nov 26 '22 06:11

Frédéric Hamidi


Since it's user-controlled, I wouldn't treat it as a "failure". The first option seems cleaner.

like image 35
ebsddd Avatar answered Nov 26 '22 07:11

ebsddd