我有这个代码可以正常工作:
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;
};
但现在我的承诺链已被破坏,我的代码也是如此。为什么会这样?
答案 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);