如何处理then()函数链接JavaScript承诺时的条件?

我正在与承诺,并需要弄清楚如何正确地链接他们,我知道如果它的工作如果承诺要么成功的决心和拒绝错误,但如果可以有一个错误状态后,一个承诺解决?

这是我的scenerio

function getUser(userId){...} // resolves if user exist and (activated or not) returning user // rejects to error1: user does not exist function doTask(user){...} // resolves on successful completion of the task // rejects error3: could not do Task 

如果我想做另一个承诺做用户id的任务,但只有当用户被激活

 // function doTaskWithUserId(userId) // reject to error1; user does not exist // reject to error2; if user is not activated // reject to error3; could not do task 

这是我能做的事情,但是如果我觉得自己在搞什么东西, 但是这似乎是一个反模式的承诺

 function doTaskWithUserId(userId){ var deffered = q.defer(); getUser(userId) .then(function(user){ if(user.activated === true){ return doTask(user); }else{ deffered.reject(error2); // user is not activated } }, function(){ deffered.reject(error1); // user does not exist }) .then(function(){ deffered.resolve(); // task complete }, function(){ deffered.reject(error3) // could not do task }) return deffered.promise; } 

看来如果我这样做,那么外部的承诺就会被挂起,我已经阅读了关于.fail()和.catch的方法,但似乎可以把我的头包裹起来。 任何帮助! 谢谢

但是这似乎是一个反模式的承诺

确实是: 延期的反模式 ! 你不需要构build一个新的延迟,你可以链接你的动作,映射和错误使用。 您将通过抛出:

 function doTaskWithUserId(userId) { return getUser(userId).then(function(user) { // ^^^^^^ if (user.activated) { return doTask(user); } else { throw error2; // user is not activated } }); // .then() returns a promise, which we return from the function }