3 回答

TA貢獻1876條經(jīng)驗 獲得超7個贊
最終,決定是否同步投擲取決于您,您可能會發(fā)現(xiàn)有人在兩邊爭辯。重要的是記錄行為并保持行為的一致性。
我對此的看法是,您的第二個選擇-將錯誤傳遞給回調(diào)-看起來更優(yōu)雅。否則,您將得到如下代碼:
try {
getUserById(7, function (response) {
if (response.isSuccess) {
//Success case
} else {
//Failure case
}
});
} catch (error) {
//Other failure case
}
這里的控制流程有些混亂。
似乎if / else if / else在回調(diào)中具有單個結(jié)構(gòu)并放棄周圍環(huán)境會更好try / catch。

TA貢獻1834條經(jīng)驗 獲得超8個贊
異步功能應始終以異步方式運行(特別是對于錯誤情況)有多重要?
非常 重要。
是否確定throw,如果你知道程序是不是一個合適的狀態(tài)的異步操作繼續(xù)進行?
是的,我個人認為這與所有異步產(chǎn)生的錯誤完全不同,并且需要分別進行處理是可以的。
如果某些用戶名由于不是數(shù)字而被認為是無效的,而某些用戶名將在服務(wù)器上被拒絕(例如,因為它們已經(jīng)被使用),則在兩種情況下都應進行一次(異步?。┗卣{(diào)。如果異步錯誤僅是由網(wǎng)絡(luò)問題等引起的,則您可能會以不同的方式發(fā)出信號。
throw當出現(xiàn)“ 意外 ”錯誤時,您總是可以的。如果您需要有效的用戶標識,則可能會拋出無效的用戶標識。如果要預期無效的變量并希望調(diào)用者處理它們,則應使用“統(tǒng)一”錯誤路由,該路由將是異步函數(shù)的回調(diào)/拒絕承諾。
并重復@Timothy:您應該始終記錄該行為并保持行為的一致性。

TA貢獻1799條經(jīng)驗 獲得超9個贊
理想情況下,不應拋出回調(diào)API,但它們確實會拋出,因為很難避免,因為您必須嘗試從字面上捕獲所有地方。請記住,throw函數(shù)拋出不需要顯式拋出錯誤by 。另一件事是,用戶回調(diào)也可以很容易地拋出,例如調(diào)用JSON.parse而沒有try catch。
因此,根據(jù)以下理想情況,代碼的行為如下:
readFile("file.json", function(err, val) {
if (err) {
console.error("unable to read file");
}
else {
try {
val = JSON.parse(val);
console.log(val.success);
}
catch(e) {
console.error("invalid json in file");
}
}
});
必須使用兩種不同的錯誤處理機制確實很不方便,因此,如果您不希望程序成為一堆脆弱的卡片(不編寫任何try catch),則應使用將所有異常處理統(tǒng)一在一個機制下的promise :
readFile("file.json").then(JSON.parse).then(function(val) {
console.log(val.success);
})
.catch(SyntaxError, function(e) {
console.error("invalid json in file");
})
.catch(function(e){
console.error("unable to read file")
})
添加回答
舉報