Nodejs q library not working as it should

I have this code which works fine:

var q = require("q");
var bcrypt = require("bcrypt");

var genSalt = function(n) {
    var deferred = q.defer(); 
    bcrypt.genSalt(n, function (err, salt) {
        if (err) deferred.reject(err);
        else deferred.resolve(salt);
    });
    return deferred.promise;
};

var hash = function(password, salt) {
    console.log(password, salt);
    var deferred = q.defer();
    bcrypt.hash(password, salt, deferred.resolve);
    return deferred.promise;
};

genSalt(10)
    .then(function (salt, err) {
        console.log("salt", salt);
        return q(salt);
     })
    .then(function (salt) {
        return hash("mypasswd", salt);
    })
    .then(function (hash, err) {
        console.log("hash", hash);
        return q(hash);
    });

But then in the docs I saw this:

// promise-translate-action.js
var promiseAction = function (arg1, arg2) {
    var deferred = Q.defer();
    action(arg1, arg2, deferred.resolve);
    return deferred.promise;
}

promiseAction(arg1, arg2).then(function (result) {
    doSomething(result);
});

Notice how the last parameter in the action function is deferred.resolve. So I thought I could do the same and save a few lines of code:

var genSalt = function(n) {
    var deferred = q.defer(); 
    bcrypt.genSalt(n, deferred.resolve);
    return deferred.promise;
};

But now my promise chain is broken, and so is my code. Why is this happening?

It won't work in your case, because deferred.resolve always resolves deferred.promise. But you may use deferred.makeNodeResolver() instead:

var genSalt = function(n) {
    var deferred = q.defer(); 
    bcrypt.genSalt(n, deferred.makeNodeResolver());
    return deferred.promise;
};

or you may use Q.nfbind(nodeFunc, ...args), which is even better:

var genSalt = Q.nfbind(bcrypt.genSalt);