2012-08-30 23 views
1

可能重複:
Is it possible to catch exceptions thrown in a JavaScript async callback?錯誤處理try&catch +回調?

我從數據庫中提取訂單,然後請求,我希望能夠打破forEach,我可以做與trycatch但我認爲回調不起作用

try{ 
    orders.find().forEach(function(order){ 
     request({ 
      "method":"get", 
      "json":true 
     },function (error, response, data){ 
      if (!error && response.statusCode == 200) { 
       console.log("Order id "+order.id); 
      }else{ 
       throw "limit"; 
      } 
     }); 
    }); 
}catch(err){ 
    if(err == "limit"){ 
     console.log("error occured"); 
    } 
} 

Thi s是什麼我得到

/Users/thomas/Desktop/forerunner/retrieveTransactions.js:120 
       throw "limit"; 
       ^
    limit 

我只是想:

error occured 
+0

@pimvdb不因爲'forEach'。 – ThomasReggi

+0

答案或多或少一樣:不可能。這實際上是有道理的,因爲ajax比'forEach'結束時晚。 – pimvdb

+0

如果您想停止迭代,只需在調用'orders.find()'之前聲明一個標誌並在遇到錯誤時進行設置。任何後續處理程序都可以查詢並返回。如果接口支持它,你也可以使用'some()',一旦處理程序返回'true'就停止處理。 – MauganRa

回答

4

您需要添加的回調函數內的try-catch,是這樣的:

orders.find().forEach(function(order){ 
    request({ 
     "method":"get", 
     "json":truetry{ 
    },function (error, response, data){ 
     try{ 
      if (!error && response.statusCode == 200) { 
       console.log("Order id "+order.id); 
      }else{ 
       throw "limit"; 
      } 
     }catch(err){ 
      if(err == "limit"){ 
       console.log("error occured"); 
      } 
     } 
    }); 
}); 
+3

這不會破壞'forEach',也有點矯枉過正。只需將代碼放在'else'塊中即可。 – pimvdb

相關問題