Class RSVP.Promise
Defined in: | node_modules/rsvp/lib/rsvp/promise.js:26 |
---|---|
Module: | @ember/application |
catch (onRejection, label) Promise
Module: | @ember/application |
---|
Defined in node_modules/rsvp/lib/rsvp/promise.js:154
- onRejection
- Function
- label
- String
- optional string for labeling the promise. Useful for tooling.
- returns
- Promise
catch
is simply sugar for then(undefined, onRejection)
which makes it the same as the catch block of a try/catch statement.
function findAuthor(){ throw new Error('couldn\'t find that author'); } // synchronous try { findAuthor(); } catch(reason) { // something went wrong } // async with promises findAuthor().catch(function(reason){ // something went wrong });
finally (callback, label) Promise
Module: | @ember/application |
---|
Defined in node_modules/rsvp/lib/rsvp/promise.js:186
- callback
- Function
- label
- String
- optional string for labeling the promise. Useful for tooling.
- returns
- Promise
finally
will be invoked regardless of the promise's fate just as native try/catch/finally behaves
Synchronous example:
findAuthor() { if (Math.random() > 0.5) { throw new Error(); } return new Author(); } try { return findAuthor(); // succeed or fail } catch(error) { return findOtherAuthor(); } finally { // always runs // doesn't affect the return value }
Asynchronous example:
findAuthor().catch(function(reason){ return findOtherAuthor(); }).finally(function(){ // author was either found, or not });
then (onFulfillment, onRejection, label) Promise
Module: | @ember/application |
---|
Defined in node_modules/rsvp/lib/rsvp/promise.js:243
- onFulfillment
- Function
- onRejection
- Function
- label
- String
- optional string for labeling the promise. Useful for tooling.
- returns
- Promise
The primary way of interacting with a promise is through its then
method, which registers callbacks to receive either a promise's eventual value or the reason why the promise cannot be fulfilled.
findUser().then(function(user){ // user is available }, function(reason){ // user is unavailable, and you are given the reason why });
Chaining
The return value of then
is itself a promise. This second, 'downstream' promise is resolved with the return value of the first promise's fulfillment or rejection handler, or rejected if the handler throws an exception.
findUser().then(function (user) { return user.name; }, function (reason) { return 'default name'; }).then(function (userName) { // If `findUser` fulfilled, `userName` will be the user's name, otherwise it // will be `'default name'` }); findUser().then(function (user) { throw new Error('Found user, but still unhappy'); }, function (reason) { throw new Error('`findUser` rejected and we\'re unhappy'); }).then(function (value) { // never reached }, function (reason) { // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'. // If `findUser` rejected, `reason` will be '`findUser` rejected and we\'re unhappy'. });
If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream.
findUser().then(function (user) { throw new PedagogicalException('Upstream error'); }).then(function (value) { // never reached }).then(function (value) { // never reached }, function (reason) { // The `PedgagocialException` is propagated all the way down to here });
Assimilation
Sometimes the value you want to propagate to a downstream promise can only be retrieved asynchronously. This can be achieved by returning a promise in the fulfillment or rejection handler. The downstream promise will then be pending until the returned promise is settled. This is called assimilation.
findUser().then(function (user) { return findCommentsByAuthor(user); }).then(function (comments) { // The user's comments are now available });
If the assimliated promise rejects, then the downstream promise will also reject.
findUser().then(function (user) { return findCommentsByAuthor(user); }).then(function (comments) { // If `findCommentsByAuthor` fulfills, we'll have the value here }, function (reason) { // If `findCommentsByAuthor` rejects, we'll have the reason here });
Simple Example
Synchronous Example
let result; try { result = findResult(); // success } catch(reason) { // failure }
Errback Example
findResult(function(result, err){ if (err) { // failure } else { // success } });
Promise Example;
findResult().then(function(result){ // success }, function(reason){ // failure });
Advanced Example
Synchronous Example
let author, books; try { author = findAuthor(); books = findBooksByAuthor(author); // success } catch(reason) { // failure }
Errback Example
function foundBooks(books) { } function failure(reason) { } findAuthor(function(author, err){ if (err) { failure(err); // failure } else { try { findBoooksByAuthor(author, function(books, err) { if (err) { failure(err); } else { try { foundBooks(books); } catch(reason) { failure(reason); } } }); } catch(error) { failure(err); } // success } });
Promise Example;
findAuthor(). then(findBooksByAuthor). then(function(books){ // found books }).catch(function(reason){ // something went wrong });
© 2020 Yehuda Katz, Tom Dale and Ember.js contributors
Licensed under the MIT License.
https://api.emberjs.com/ember/2.18/classes/RSVP.Promise/methods