我有以下方法時處理異常。最佳實踐使用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