문제

Angularjs를 사용하여 관리 앱에서 일하고 있습니다. 앱은 $ 자원을 사용하여 서버에서 데이터를 가져옵니다. 데이터가 가져 오는시기를 결정하기 위해 '$ PROMISE'속성이 포함 된 데이터 객체로 끝납니다. 모든 것이 괜찮아요.

이제이 관리 앱은 새 개체를 만들 수도 있습니다. 이러한 새 개체는 일반적으로 '$ RESOURCE'에서 제공되는 것보다 동일한 컨트롤러에 의해 관리됩니다.

이제는 2 종류의 물체가 있습니다.

  • $ Promise 속성이있는 객체. 전체 데이터로 조작하기 전에 $ Promise.then ()을 사용해야합니다.
  • 일반 물체. 그들은 $ PROMISE 속성이 없으며, 그 값은 즉시
  • 에 액세스 할 수 있습니다

코드를 줄이고 단일 유스 케이스가 있고, 오브젝트 데이터가 해결되었는지, 또는 약속이 아닌 경우를 확인하지 않아도됩니다.

가 자신에게 이미 해결 된 '$ PROMISE'속성을 추가하여 '평범한'물체를 구축하는 데 문제가 있습니까? 그런 식으로, 나는 항상 'myObject, $ promise.then ()'를 사용합니다.

이 상황을 처리하는 일반적인 패턴이 있습니까? 나는 이런 종류의 객체를 각도로 만들기 위해 '표준'방법을 찾을 수 없었다.

도움이 되었습니까?

해결책

$ q. / 객체에는 약속이 있거나 아닙니다.

(obj.$promise ? obj.$promise || $q.when(objResult)).then(function(result){
          //handle success case.
          //Incase of object not having the $promise property result will be object itself
}) 
.

결과 속성이 약속이 없으면 이것이 약속으로 해결 될 것입니다.

가치 또는 (제 3 자) 일 수있는 객체를 $ Q 약속에 대한 약속을줍니다. 이것은 약속 일 수도 있고 아닐 수도 있고, 약속이 신뢰할 수없는 소스에서 유래 된 경우 유용합니다.

항상 약속을 만들고 전송되는 데이터에 첨부 할 필요가 없습니다. 예 : -

   function getCurrentUserData(userId){
       var defered = $q.defer();
       ... 
       //Check in my cache if this is already there, then get it from cache and resolve it
       defered.resolve(objectFromCache);
      //my else condition
      //It is not in cache so let me make the call.
      $http.get('myurl').then(function(result){
            //Do validation with data and if it doesnot match then reject it
            defered.reject(reason);
             //Else Do something with the data put it into the cache, mapping logic etc..
             defered.resolve(dto);


      }).catch(function(error){
            //do something with error and then reject
            defered.reject(reasonDerived);
      });
      return defered.promise;
   }
.

여기에 간단하고 덜 명백한 버전이 있습니다 (크레딧 : Benjamin Gruenbaum) :

var cached = null;
function getCurrentUserData(userId){
    return cached = cached || $http.get('myurl').then(function(result){
        if(isNotValid(result)) return $q.reject(reason); // alternatively `throw`
        return transformToDto(result);
    }, function(response){
     if(checkforsomethingonstatusandreject)
       return $q.reject('Errored Out')
     //do some actions to notify the error scenarios and return default actions
     return someDefaults; });
    }
.

물론 return $q.reject(derivedReason)는 그 이유를 반환하는 것이 아니라 추가 수표를 기반으로 변환하는 것이 아니라, 아이디어는 가치가 아닌 약속을 캐싱하고 있습니다. 이는 메소드가 한 번 반환하기 전에 호출되면 여러 HTTP 요청을하지 않는 이점이 있습니다.

이제는 항상 할 수 있습니다 : -

    getCurrentUserData(userid).then(function(user){

    }).catch(function(error){

    });
.

약속은 또한 체인 될 수 있습니다. 그래서 당신은 또한 이것을 할 수 있습니다 : -

   return $resource('myresource').$promise.then(function(result){
          //Do some mapping and return mapped data
         return mappedResult;
    });
.

다른 팁

A + 약속은 정적 방법을 제공해야합니다 :

Promise.resolve(val);
.

... 미리 해결 된 약속을 생성합니다.약속 도서관이이를 제공하는 경우이 중 하나를 반환해야합니다.큰.인터페이스 복제를 피하기 위해 자주 수행합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top