2012-08-08 155 views
0

我正在編寫向服務器發送Ajax請求的代碼。我正在使用try/catch來處理請求之外的錯誤,如下所示。搜索方法將請求發送到服務器,如果它可以讀取結果,它將調用回調函數。我問這個:因爲ajax請求是異步的,如果回調裏面有一個錯誤(不是在搜索方法內部),它會落入外部catch塊還是需要另一個try/catch回調函數?Javascript嘗試/捕獲範圍

try { 
    service.search(function() { 
     var entries = service.getEntries(); 
     $.each(entries, function (index, content) { 
      var cat = { 
       // those may throw exceptions, too 
       name: content.get("category"), 
       path: content.getPath() 
      }; 
      categories.push(cat); // defined somewhere else. 
     }); 
     if (categories.length < totalResults) { 
      // A method call may throw exception 
     } else if (typeof loadCallback === 'function') { 
      // Done. 
     } 
    }); 
} catch (e) { 

} 
+2

我不敢肯定,但我想'service.search()'會有一個'onerror'回調參數可以用來捕獲異常,但就你的問題而言,我想它會被該catch塊攔截,但當然不能確定。 – yogi 2012-08-08 06:48:50

+1

我想答案可能是'它取決於'...正如@yogi所說,異步方法應該有一些回調參數來完成後檢查錯誤。 – helpermethod 2012-08-08 06:51:35

+0

在我的情況下,它需要太多的代碼來使用回調函數,因爲我有太多的函數互相調用像鏈。然後我需要給每個人寫回調。 – sedran 2012-08-08 06:55:26

回答

0

兩年或三年的JavaScript開發之後,我發現,在Ajax請求捕捉錯誤的最佳方式是有多個回調:一個成功的和一個錯誤。

我已經更改了Netmera HTML5 SDK中的所有方法,現在我們不需要任何try/catch塊。所有我們需要做的是傳遞兩個函數參數:

service.search(function(dataArray) { 
    // loop through dataArray 
}, function(exception) { 
    // Exception detail 
} 

而且搜索方法中,它是這樣的:

this.search = function(successCallback, errorCallback) { 
    ... 
    request.onreadystatechange = function() { 
     if (request.readyState == 4) { 
      if (request.status == 200) { 
       successCallback(...); 
      } else { 
       errorCallback(...); 
      } 
     } 
    }; 
    request.ontimeout = function() { 
     errorCallback(...); 
    }; 

    request.send(...); 
};