Created
November 24, 2012 15:47
-
-
Save JamesMGreene/4140215 to your computer and use it in GitHub Desktop.
Using Q, is this the best way to pass the results of two sequenced promises to the subsequent `then`/`spread` clause?
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 'use strict'; | |
| var Q = require('q'); | |
| var cmd = new require('commander').Command(); | |
| var client = new require('myAwesomeApi').Client(); | |
| var getUsername = function(done) { | |
| var username; | |
| cmd.prompt('Username: ', function(name) { | |
| if (!name) { | |
| done(new Error('You must provide a username!')); | |
| } | |
| else { | |
| done(null, username); | |
| } | |
| }); | |
| }; | |
| var getPassword = function(done) { | |
| cmd.password('Password: ', '*', function(pass) { | |
| if (!pass) { | |
| done(new Error('You must provide a password!')); | |
| } | |
| else { | |
| process.stdin.destroy(); | |
| done(null, pass); | |
| } | |
| }); | |
| }; | |
| Q.napply(getUsername, null, []).then(function(username) { | |
| return Q.napply(getPassword, null, []).then(function(password) { | |
| return Q.resolve([username, password]); | |
| }); | |
| }).spread(function(username, password) { | |
| return Q.napply(client.login, client, [username, password]); | |
| }) |
Author
No, fail shouldn't go before done; in that case: it does change the semantics.
.then(f1, r1, p1).fail(f2).end() should be replaced with .then(f1, r1, p1).fail(f2).done() or .then(f1, r2, p1).done(undefined, f2). I often cap with an empty .done(); I sometimes use .done(f) or sometimes .done(f, r).
Also: if you're writing only for Node you can use .catch instead of .fail (and .finally instead of .fin).
Author
Cool, I'll go with catch (definitely prefer its obviously semantic name over fail) and an empty done. Thanks again!
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
FWIW, using
.fail(...).done(...);feels very unnatural to me as thedonehandler is receiving a resolved promise value from my previousthenbut thefailhandler is in the middle of the two, creating a mentally diverted/disjoint flow. Recommendations to fix that?Where do you normally put your
failhandler? Or, do you instead use thedonehandler's rejection argument (2nd function)? Would thedonehandler's rejection function receive failures from any point in the promise chain likefaildoes? I'm guessing not.