我有以下方法时处理异常。最佳实践使用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解决了我的问题,但任何其他意外的异常都不会被捕获。
有没有更好的方法我应该处理这个问题?
不是downvoter,但我想知道 - 为什么你在同步代码中使用承诺开始?另外 - 如果你使用承诺,抛出和拒绝是同样的事情。 – 2014-10-29 16:41:33
我在同步代码b/c中使用promise,它是库的一部分,我不希望用户必须知道lib中的哪些方法是同步的,哪些不是,所以我让它们都是异步的。我知道扔和拒绝是一样的。我实际上并没有抛出任何东西。 – Catfish 2014-10-29 16:54:13
当然你是 - 当你做'a.b.c ...'时,不知道你在那里写了什么代码,可能会抛出一些代码,以便在捕获完成之后就可以抛出'rejext'。 – 2014-10-29 16:58:03