2012-08-30 4 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"); 
    } 
} 

티 의 난 그냥 싶어 내가

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

받고 있어요 무엇 :

error occured 
+0

@pimvdb하지 'forEach' 때문에 마찬가지입니다. – ThomasReggi

+0

대답은 거의 같습니다 : 불가능합니다. 아약스는 forEach가 끝나는 것보다 늦게 끝나기 때문에 실제로 이해가됩니다. – pimvdb

+0

반복을 멈추고 싶다면'orders.find()'를 호출하기 전에 플래그를 선언하고 에러가 발생했을 때 플래그를 설정하십시오. 이후의 모든 핸들러는이를 쿼리하고 리턴 할 수 있습니다. 인터페이스가 그것을 지원하면,'some()'을 사용할 수도 있습니다. 이것은'true '를 반환하자마자 처리를 중단합니다. – MauganRa

답변

4

당신은 콜백 함수 내에서 시도 - 캐치를 추가 할 필요가, 뭔가 같은 :

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