2014-10-29 137 views
-3

我有以下方法时处理异常。最佳实践使用Q.promise

我遇到的问题是,如果someObject为空或没有所有适当的嵌套属性,则抛出异常并且承诺永远不会解析。我实际上看到异常的唯一方法是如果我在调用函数上有.fail,但仍然不能解决承诺。

如何,我现在可以看到除了将实施例:

myLib.getId.then(function() { 
    // something 
}).fail(function(err) { 
    console.log(err); 
}); 

我知道2点的方式来解决这个问题,但我不知道,如果是两种处理这样的事情最好的办法。

选项1(使用尽我Q.promise内/捕获):

module.exports.getId = function(someObject) { 

    var myId = null; 

    return Q.Promise(function(resolve, reject, notify) { 

     try { 
     // Loop through all the id's 
     someObject.user.player._id.forEach(function (id) { 

      if (id.root == "1.2.3.4.5.6") { 
       myId = id.extension; 
      } 
     }); 

     } catch(e) { 
     reject(e); 
     } 

     resolve(myId); 
    }); 
}; 

选项2(明确检查someObject.user.player._id存在):

module.exports.getId = function(someObject) { 

    var myId = null; 

    return Q.Promise(function(resolve, reject, notify) { 

     ifi(someObject.user.player._id exists..) { 

     // Loop through all the id's 
     someObject.user.player._id.forEach(function (id) { 

      if (id.root == "1.2.3.4.5.6") { 
       myId = id.extension; 
      } 
     }); 

     resolve(myId); 
     } else { 
     reject('invalid object'); 
     } 
    }); 
}; 

选项1似乎闻到时髦,因为我使用try/catch内的承诺。选项2解决了我的问题,但任何其他意外的异常都不会被捕获。

有没有更好的方法我应该处理这个问题?

+0

不是downvoter,但我想知道 - 为什么你在同步代码中使用承诺开始?另外 - 如果你使用承诺,抛出和拒绝是同样的事情。 – 2014-10-29 16:41:33

+0

我在同步代码b/c中使用promise,它是库的一部分,我不希望用户必须知道lib中的哪些方法是同步的,哪些不是,所以我让它们都是异步的。我知道扔和拒绝是一样的。我实际上并没有抛出任何东西。 – Catfish 2014-10-29 16:54:13

+1

当然你是 - 当你做'a.b.c ...'时,不知道你在那里写了什么代码,可能会抛出一些代码,以便在捕获完成之后就可以抛出'rejext'。 – 2014-10-29 16:58:03

回答

-1

你的第一个例子中有几个问题:

  • 当你捕获异常,您拒绝的承诺,那么解决的承诺。这违反了诺言合同;您可以通过致电try内的解决方案解决问题,而不是在外面。
  • 通过使用try/catch,你可能会吞下意想不到的错误。那是你假设唯一的错误将来自someObject.user.player._id不存在。目前这可能是真实的,但不能保证随着代码的发展而保持真实。

通过严格测试已知错误情况,您知道您不会吞咽意外错误。因此,我会用你的第二个例子。

+0

@downvoter请解释downvotes,所以我可以删除/改善答案 – 2014-10-29 16:44:12

+1

不是我,但我不明白这是如何解决这个问题除了“这是我认为,这样和那样的” – 2014-10-29 16:45:27

+0

Downvoting巨魔今天在这里 – Catfish 2014-10-29 16:54:49