如何获得成功实现一系列承诺的第一个承诺的价值

我正在寻找一种方法, 只有在另一个承诺失败的情况下才能返回承诺

我怎样才能做到这一点?

我看起来像这样的承诺(当然,我已经删除了不相关的代码):

getUserByUsername = function(username) {
    return promise(function(resolve, reject) {
       user = userModel.getByUsername(username);
       if ( user ) { resolve(user); } else { reject("user not found"); }
    });
};

getUserByEmail = function(email) {
    return promise(function(resolve, reject) {
       user = userModel.getByEmail(email);
       if ( user ) { resolve(user); } else { reject("user not found"); }
    });
};

checkPassword = function(user, password) {
    return promise(function(resolve, reject) {
       if ( user.isValidPassword(password) ) { resolve() } else { reject("password mismatch"); }
    });
};

我想按照以下顺序将它们结合起来

  • 调用getUserByUsername ,如果拒绝,则调用getUserByEmail
  • 如果两个承诺都不能拒绝整个链条,则返回从上述两个承诺解决的任何人的价值。
  • 用值调用checkPassword ,如果拒绝,拒绝整个链
  • 到目前为止,我已经做到了这一点,它似乎工作。 (我使用when.js btw)

    getUserByUsername(usernameOrEmail)
    .then( 
        function(user) { return user; }, 
        function() { return getUserByEmail(usernameOrEmail) } 
    )
    .then( function(user) { return checkPassword(user, password) } )
    .done( 
        function() { console.log('success'); }, 
        function(err) { console.log('failure', err) }
    );
    

    所以,这段代码的工作原理,但我敢肯定,应该有更优雅的方式做到这一点(我认为我的代码看起来更像是黑客)。


    那样的事情呢?

     getUserByUsername(usernameOrEmail).
     catch(getUserByEmail.bind(null, usernameOrEmail)).
     then(function(user){
         if(!isValidPassword(user, password)) throw new Error("Invalid Password");
     }).then(function(){
         // success
     }, function(){
        //fail
     });
    

    关键的事情:

  • 你可以throw承诺并return继续链。 promise构造函数没有什么用处。
  • 您可以通过.then(null, function(){...省略.then的第一个参数,但是使用.catch更简单,它是一个别名。更一般地说.then忽略不是函数的参数。
  • 拒绝和返回值传播,如果不经过处理拒绝.catch (或第二个参数.then )便索性整个链条移动,直到你怎么做。 返回值也是如此 - 这就是为什么这里的前两行包含:
  • 尝试通过用户名获取用户
  • 如果失败,请尝试通过电子邮件。
  • 总体而言,您所描述的非常适用于同步代码中的异常的承诺和相似性。 学习如何有效地做这种事情很重要。

    链接地址: http://www.djcxy.com/p/55447.html

    上一篇: How to get the value of the first promise that succeeds in a chain of promises

    下一篇: Sequential execution of Promise