Asuming下一个复位密码功能:节点承诺,链接会导致功能太多return语句
function forgotPassword(email){
return Promise.resolve().then(function() {
return User.findByMail(email);
}).then(function(user){
if (!user) {
return Promise.reject({message: 'Cannot find user with that email'});
}
return [user, tokensService.createRandomBytes()];
}).spread(function(user, token){
user.resetPasswordToken = token;
user.resetPasswordExpires = Date.now() + 3600000; // 1 hour
return [user.saveAsync(), token];
}).spread(function(user, token){
return emailService.sendResetPassword(user.email, token);
});
}
这个函数的调用者需要一个承诺作为返回值。
但我的问题是: 这是连锁承诺的正确方法吗?
它在我看来像所有的返回语句使代码看起来不可读。
有没有办法避免这种情况?有没有办法在开始时避开return Promise.resolve().then...
?
PS。我使用bluebird
作为承诺的lib
UPDATE:
丹斯的回答后,我做了以下内容:
function login(email, password) {
return User.findByMail(email).then(function(user){
return [user.comparePassword(password), user];
})
}
,我不断收到未定义不是一个函数,这里是堆栈跟踪:
TypeError: undefined is not a function
at Object.login (/home/royi/projects/travessey-api/src/authentication/authentication-controller.js:17:11)
at /home/royi/projects/travessey-api/src/authentication/authentication-router.js:8:18
at Layer.handle [as handle_request] (/home/royi/projects/travessey-api/node_modules/express/lib/router/layer.js:95:5)
at next (/home/royi/projects/travessey-api/node_modules/express/lib/router/route.js:131:13)
at Route.dispatch (/home/royi/projects/travessey-api/node_modules/express/lib/router/route.js:112:3)
at Layer.handle [as handle_request] (/home/royi/projects/travessey-api/node_modules/express/lib/router/layer.js:95:5)
at /home/royi/projects/travessey-api/node_modules/express/lib/router/index.js:277:22
at Function.process_params (/home/royi/projects/travessey-api/node_modules/express/lib/router/index.js:330:12)
at next (/home/royi/projects/travessey-api/node_modules/express/lib/router/index.js:271:10)
at Function.handle (/home/royi/projects/travessey-api/node_modules/express/lib/router/index.js:176:3)
at router (/home/royi/projects/travessey-api/node_modules/express/lib/router/index.js:46:12)
at Layer.handle [as handle_request] (/home/royi/projects/travessey-api/node_modules/express/lib/router/layer.js:95:5)
at trim_prefix (/home/royi/projects/travessey-api/node_modules/express/lib/router/index.js:312:13)
at /home/royi/projects/travessey-api/node_modules/express/lib/router/index.js:280:7
at Function.process_params (/home/royi/projects/travessey-api/node_modules/express/lib/router/index.js:330:12)
at next (/home/royi/projects/travessey-api/node_modules/express/lib/router/index.js:271:10)
at allowCrossDomains (/home/royi/projects/travessey-api/src/authentication/authentication-middleware.js:34:5)
at Layer.handle [as handle_request] (/home/royi/projects/travessey-api/node_modules/express/lib/router/layer.js:95:5)
at trim_prefix (/home/royi/projects/travessey-api/node_modules/express/lib/router/index.js:312:13)
at /home/royi/projects/travessey-api/node_modules/express/lib/router/index.js:280:7
at Function.process_params (/home/royi/projects/travessey-api/node_modules/express/lib/router/index.js:330:12)
at next (/home/royi/projects/travessey-api/node_modules/express/lib/router/index.js:271:10)
at /home/royi/projects/travessey-api/node_modules/express-validator/lib/express_validator.js:228:5
at Layer.handle [as handle_request] (/home/royi/projects/travessey-api/node_modules/express/lib/router/layer.js:95:5)
at trim_prefix (/home/royi/projects/travessey-api/node_modules/express/lib/router/index.js:312:13)
at /home/royi/projects/travessey-api/node_modules/express/lib/router/index.js:280:7
at Function.process_params (/home/royi/projects/travessey-api/node_modules/express/lib/router/index.js:330:12)
at next (/home/royi/projects/travessey-api/node_modules/express/lib/router/index.js:271:10)
at urlencodedParser (/home/royi/projects/travessey-api/node_modules/body-parser/lib/types/urlencoded.js:81:44)
at Layer.handle [as handle_request] (/home/royi/projects/travessey-api/node_modules/express/lib/router/layer.js:95:5)
at trim_prefix (/home/royi/projects/travessey-api/node_modules/express/lib/router/index.js:312:13)
at /home/royi/projects/travessey-api/node_modules/express/lib/router/index.js:280:7
at Function.process_params (/home/royi/projects/travessey-api/node_modules/express/lib/router/index.js:330:12)
at next (/home/royi/projects/travessey-api/node_modules/express/lib/router/index.js:271:10)
您可以使用一个回调fonction –
@JohnSmith你能否详细些吗? – tubu13
对不起。我在我的手机上,但你可以尝试像这样 '忘记密码(电子邮件,(结果,错误)=> {if(err){...}; //做结果}} 然后 '函数forgotPassword(email,callback){return Promise.resolve(...)。then((resultResolve)=> {callback(resultResolve)})。catch((err)=> {callback(null,new Error(err) )}); }' –