我正在使用mongoose和蓝鸟初始化promisifyAll
。这很酷,我很喜欢这些承诺。但是mongoose的model.save()
会返回像(err, user, numAffected)
这样的函数签名,因此bluebird' s model.saveAsync()
会返回一个双元素数组,而不仅仅是明显的结果。这使链接不方便,所以我采取了这样的小辅助功能:
function saveUser(user) {
return user.saveAsync()
.spread(function (user, numAffected) {
return user;
});
}
在宣传猫鼬原型时添加它会更容易,只需在整个应用程序中执行一次......但我不知道如何。
答案 0 :(得分:1)
这将在3.0中修复,但现在你可以使用过滤器和自定义promisifier:
// Promisifies only methods named "save"
Promise.promisifyAll(require("mongoose"), {
filter: function(name) {
return name === "save"
},
promisifier: function(save, defaultPromisifier) {
var saveAsync = defaultPromisifier(save);
return function() {
return saveAsync.apply(this, arguments).spread(function(first) {
return first;
});
}
}
});
// Promisify rest of the mongoose... it will ignore save as it was already promisified
Promise.promisifyAll(require("mongoose"));
答案 1 :(得分:0)
您可以修补user.saveAsync
var user_saveAsync = user.saveAsync;
user.saveAsync = function() {
return user_saveAsync.bind(this)() //-> same as calling `user.saveAsync()`
.spread(function(user) { // but now you're returning spreaded result
return user;
});
}
然后你可以做
function saveUser(user) {
return user.saveAsync();
}