2014-04-18 3 views
1

breeze로 만든 모든 호출에 기본 오류 처리기를 제공하는 방법이 있습니까?breeze : 기본 오류 처리기

는 지금은 breeze.EntityManager.fetchEntityByKey/breeze.EntityQuery.execute/breeze.EntityManager.saveChanges

나는 모든 통화에 대해 기본 오류 처리기를 설정하고 특정 통화에 대한 기본 핸들러를 오버라이드 (override) 할 수 있다면 그것은 가장 좋은 것입니다에 의해 반환 된 모든 약속에 대한 .fail (onFail)를 추가해야합니다.

+0

당신 항상 당신이 유형의 불가지론의 모든 일반 전화로 그룹화하는 경우 다른 메소드 이럴 실패하지만, 다른 사람을 위해해야 ​​논리를 실패 저장하여 쿼리는 동일한 호출을 거쳐 쿼리 로직 코드와 실패 로직을 모두 줄일 수 있습니다. –

+0

이 작업을 더 자세히 설명하기 위해 기본 함수를 사용하여 쿼리를 생성 한 다음 오류 로직이있는 위치로 확장합니다 그것이 한 번 정의 된 것이다. 새로운 바람을 느낄 때가 더 편리 할 수도 있습니다. –

답변

2

바람은 응용 프로그램 시작시 오류 처리기를 설정할 수 있습니다 :

var ajaxAdapter = breeze.config.getAdapterInstance("ajax"); 

ajaxAdapter.requestInterceptor = function (requestInfo) { 
    // this method is called for every request made with breeze ajax adapter 
    // all callbacks are in zConfig 
    var 
     successHandler = requestInfo.zConfig.success, 
     errorHandler = requestInfo.zConfig.error || handleBadRequest, 
     finalHandler = requestInfo.zConfig.finally; // final handler for calls, made directly with adapter 

    if (finalHandler) { 
     requestInfo.zConfig.success = function (response) { 
      if(successHandler) { 
       successHandler(response); 
      } 
      finalHandler(response); 
     } 
    } 

    requestInfo.zConfig.error = function (response) {    
     switch (response.status) { 
     case 400: 
      // call error handler only for 'BadRequest' 
      errorHandler(parseErrors(response)); 
      break; 
     case 401: 
      handleUnauthorizedRequest(response); 
      break; 
     default: 
      handleServerOrUnrecognizedError(response); 
      break; 
     } 
     if (finalHandler) { 
      finalHandler(response); 
     } 
    }; 
}; 
2

나는 많은 의견을 남기기 시작했고 대답을 대신하기로 결정했다. 'queryRunner'를 사용하는 경우 공유 하나의 정의 queryFailed 방법이있다

var thisQuery = breeze.entityQuery.from('Whatever').where('pwkad', '==', 'awesome'); 
queryRunner(thisQuery); 

function queryRunner(query) { 
    query.execute().fail(queryFailed); 
}; 

function queryFailed(error) { 
    console.log(error.message); 
}; 

- 당신은 항상 필요한 코드를 줄이고 재사용 성을 향상시키기 위해이 작업을 수행 할 수 있습니다. 그런 다음 유형에 대해 알 수없는 재사용 가능한 코드를 모두 넣을 수 있습니다. 추가 단계를 진행하기 위해 다른 모든 쿼리가 '상속 (inherit)'(나는 느슨하게 사용함)이라는 쿼리를 작성하여 쿼리를 빌드하고 단일 코드베이스 만 유지하는 매개 변수를 사용하는 위치로 만들 수 있습니다. 프런트 엔드 및 API 코드 모두에 대한 규칙을 따르도록 강요하므로이 작업을 수행하는 것이 좋습니다 (모든 Breeze.js 프로덕션 응용 프로그램에서 사용).

// All is pseudo code 
function getEntityById (manager, type, resourcePath, forceRemote, idProp, idValue, params) { 
    if (!manager) { throw "Must pass in a manager"; } 

    var query = breeze.entityQuery.from(resourcePath).toType(type); 

    if (!forceRemote) { 
     // Put your code here to get from cache 
     var entity = breeze.fetchEntityByKey(); 
     if (entity) { 
      return entity; 
     } 
    } 

    if (params) { 
     // Pass in a valid params object and set it to whatever 
     query.withParameters(params); 
    } 

    if (idValue && idProp) { 
     query.where(idProp, '==', idValue); 
    } 

    query.execute().fail(queryFailed); 

    function queryFailed(error) { 
     console.log(error); 
    } 
} 

어디에서 호출 할 수있는 ID로 엔티티를 '수'필요 - -

나는이 나를 위해 보이지만 여기에 빠른 예입니다 정확히 어떻게 내 비밀 소스를 포기하지 않습니다
var manager = new breeze.entityManager(); 

var hamburger = getEntityById(manager, 'Hamburger', 'Hamburgers', true, 'id', 1); 

이 방법을 사용하면 하나의 단일 브리즈 쿼리를 작성하고 시간이 많이 걸리는 곳에서 호출 할 수 있으며 매개 변수를 올바르게 제공하면 디버깅이 가능합니다.

+0

앱 시작시 breeze queries setup을 찾고있었습니다. 당신의 대답에도 좋은 점이 있습니다. – blazkovicz