第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

異步API是否應該同步拋出?

異步API是否應該同步拋出?

慕妹3146593 2019-10-22 21:08:30
我正在編寫一個JavaScript函數(shù),該函數(shù)發(fā)出HTTP請求并返回對結(jié)果的承諾(但該問題同樣適用于基于回調(diào)的實現(xiàn))。如果我立即知道為該函數(shù)提供的參數(shù)無效,該函數(shù)應該throw同步還是應該返回被拒絕的Promise(或者,如果您愿意,請使用Error實例調(diào)用回調(diào))?異步功能應始終以異步方式運行(特別是對于錯誤情況)有多重要?是否確定throw,如果你知道程序是不是一個合適的狀態(tài)的異步操作繼續(xù)進行?例如:function getUserById(userId, cb) {  if (userId !== parseInt(userId)) {    throw new Error('userId is not valid')  }  // make async call}// OR...function getUserById(userId, cb) {  if (userId !== parseInt(userId)) {    return cb(new Error('userId is not valid'))  }  // make async call}
查看完整描述

3 回答

?
幕布斯6054654

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。


查看完整回答
反對 回復 2019-10-22
?
MMMHUHU

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:您應該始終記錄該行為并保持行為的一致性。


查看完整回答
反對 回復 2019-10-22
?
揚帆大魚

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")

})


查看完整回答
反對 回復 2019-10-22
  • 3 回答
  • 0 關(guān)注
  • 352 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號