【问题标题】:How do you handle conditions in then() functions when chaining javascript promises?链接 javascript 承诺时,如何处理 then() 函数中的条件?
【发布时间】:2015-05-29 21:33:57
【问题描述】:

我正在使用 Promise 并且需要弄清楚如何正确链接它们,我了解如果 Promise 在成功时解决并在错误时拒绝它是如何工作的,但是如果在其中一个 Promise 之后可能出现错误状态怎么办解决了吗?

这是我的场景

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 方法,但我似乎对它们感到困惑。什么都有帮助!谢谢

【问题讨论】:

    标签: javascript node.js promise q chaining


    【解决方案1】:

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

    确实是:deferred antipattern!你不需要构造一个新的deferred,你可以使用thenjust chain你的动作、映射和错误。您只需通过投掷来reject the returned promise

    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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-25
      相关资源
      最近更新 更多