Javascript 在模块之间共享承诺与拥有多个承诺
我正在使用Kris Kowal的Q库实现带有控制器和存储库的Node.js逻辑。我觉得我在下面的例子中使用承诺的方式是不正确的。但我找不到任何关于如何通过多个层或函数使用承诺的正确模式的指导 我做得对吗?实现这种逻辑的正确方法是什么 //模块:存储库 //模块:用户 我有一种感觉,我使用承诺的方式是不正确的 是的,你经常使用这个词,这意味着您只需Javascript 在模块之间共享承诺与拥有多个承诺,javascript,node.js,promise,repository-pattern,q,Javascript,Node.js,Promise,Repository Pattern,Q,我正在使用Kris Kowal的Q库实现带有控制器和存储库的Node.js逻辑。我觉得我在下面的例子中使用承诺的方式是不正确的。但我找不到任何关于如何通过多个层或函数使用承诺的正确模式的指导 我做得对吗?实现这种逻辑的正确方法是什么 //模块:存储库 //模块:用户 我有一种感觉,我使用承诺的方式是不正确的 是的,你经常使用这个词,这意味着您只需返回值,甚至可以从然后回调中得到承诺,.then()调用将产生这些返回值的承诺。当您抛出时,结果承诺将被拒绝 您在repository模块中对延迟的使用
返回值,甚至可以从然后
回调中得到承诺,.then()
调用将产生这些返回值的承诺。当您抛出
时,结果承诺将被拒绝
您在repository模块中对延迟的使用是正确的,因为需要使用db.query
api。但是用户模块可能会大幅缩减,当您已经有了承诺时,您不需要使用任何延迟
function isEmailAvailable(value) {
return Repository.findOne({email: value})
.then(function (user) {
return !user || self.id === user.id;
});
}
this.save = function() {
return isEmailAvailable(this.email)
.then(function (result) {
if (result) {
return Repository.upsert(self)
.then(null, function(err) {
throw new Error('Account save error');
});
} else {
throw new Error('The email is already in use');
}
}, function(err) {
throw new Error('Account validation error');
});
};
或者,按照@Roamer-1888的建议,使用:
如果isEmailAvailable()。这就是你的意思吗?伯吉,是的,基本上是这样。我可能会省去“帐户验证错误”抛出,因为它可能会掩盖存储库抛出的更好的错误消息。findOne()
@Roamer-1888:是的,也许会更好,但我希望在行为上与OPs函数保持一致,它应该掩盖findOne()
抛出的错误。是的,很酷。有了你的解释,OP可以选择走哪条路。
var isEmailAvailable = function (value) {
var deferred = Q.defer();
Repository.findOne({email: value})
.then(function (user) {
if (user) {
if (self.id === user.id) {
deferred.resolve(true);
}
else {
deferred.resolve(false);
}
} else {
deferred.resolve(true);
}
})
.fail(function (err) {
deferred.reject(err);
});
return deferred.promise;
};
this.save = function () {
var deferred = Q.defer();
isEmailAvailable(this.email)
.then(function (result) {
if (result) {
Repository.upsert(self)
.then(function (user) {
deferred.resolve(user); //--- Yey!!!
}).fail(function () {
deferred.reject('Account save error')
});
} else {
deferred.reject('The email is already in use');
}
}).fail(function () {
deferred.reject('Account validation error')
});
return deferred.promise;
};
function isEmailAvailable(value) {
return Repository.findOne({email: value})
.then(function (user) {
return !user || self.id === user.id;
});
}
this.save = function() {
return isEmailAvailable(this.email)
.then(function (result) {
if (result) {
return Repository.upsert(self)
.then(null, function(err) {
throw new Error('Account save error');
});
} else {
throw new Error('The email is already in use');
}
}, function(err) {
throw new Error('Account validation error');
});
};
function isEmailAvailable(value) {
return Repository.findOne({email: value})
.then(function (user) {
if (user && self.id !== user.id)
throw new Error('The email is already in use');
}, function(err) {
throw new Error('Account validation error');
});
}
this.save = function() {
return isEmailAvailable(this.email)
.then(function () {
return Repository.upsert(self)
.then(null, function(err) {
throw new Error('Account save error');
});
});
};