Nodejs q库不能正常工作

时间:2014-10-03 21:06:46

标签: node.js callback q

我有这个代码可以正常工作:

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);
    });

但是在文档中我看到了这个:

// 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);
});

注意action函数中的最后一个参数是deferred.resolve。所以我认为我可以做同样的事情并保存几行代码:

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

但现在我的承诺链已被破坏,我的代码也是如此。为什么会这样?

1 个答案:

答案 0 :(得分:0)

它不适用于您的情况,因为deferred.resolve始终会解析deferred.promise。 但您可以改为使用deferred.makeNodeResolver()

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

或者你可以使用Q.nfbind(nodeFunc, ...args),这更好:

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