2016-08-09 4 views
3

약속을 inspection2update.DamageTypeId 속성으로 반환하는 HTTP 서비스가 있으며 계속 더 실행합니다.angularjs 데이터 용 HTTP 서비스 대기

HTTP 서비스 : 나는 컨트롤러에서 서비스 호출 방법은 다음과

function post(objectTypeId, damageDescription) { 
    var defer = $q.defer(); 
    $http.post(serviceAddress + "save/" + objectTypeId + "/" + damageDescription).then(function (response) { 
     defer.resolve(response.data); 
    }); 
    return defer.promise; 
} 

:

inspection2update.DamageTypeId = damageTypesService.save(inspection2update.ObjectTypeId, self.dType); 

하지만 내가 서비스에서 데이터를 얻을 만 그 이후, 더 실행 때까지 기다릴 필요가있다.

이 목적을 위해 나는 $ http resolver 내에서 $q 서비스를 사용하지만, 여전히 내 서비스와 데이터로부터 약속을 얻는다.

서비스가 데이터를 대기하도록하려면 코드에서 무엇을 변경해야합니까?

답변

2

http 호출이 데이터를 가져온 후에 해결 된 약속을 반환합니다. 이 서비스를 사용하는 소비자는 해결하겠다는 약속을 기다릴 필요가 있으며 then은 데이터로 무엇인가를합니다.

는 약속 데이터를 수신하기 위해 then 구문을 사용하여 더 실행합니다

damageTypesService.save(inspection2update.ObjectTypeId, self.dType).then(function(data) { 
    inspection2update.DamageTypeId = data; 
    // rest of execution... 
}); 

PS - 지금까지의 내가 볼 수 귀하의 경우 $q의 아무 소용이 (가없는 당신은 데이터와 어울려하지 않으려면/로그 등 ...). 같이 당신은 $http 전화를 반환 할 수 있습니다

function save(objectTypeId, damageDescription) { 
    return $http.post(serviceAddress + "save/" + objectTypeId + "/" + damageDescription); 
} 
2

.then 기능

damageTypesService.save(inspection2update.ObjectTypeId, self.dType).then(function(response){ 
    /*use the response here 
    eg: inspection2update.DamageTypeId = response.id 
    */ 
    }) 
+0

지연된 데이터 (데이터)의 요점은 무엇입니까? 콜백이 발생하면 데이터가 이미 해결됩니다. –

2

우선 $q

function save (objectTypeId, damageDescription) { 
    var deferred = $q.defer(); 

    $http({ 
    url: serviceAddress + "save/" + objectTypeId + "/" , 
    method: 'POST', 
    data: damageDescription 
    }) 
    .success(function (data) { 
    deferred.resolve(data); 
    }) 
    .error(function (data) { 
    deferred.resolve(data); 
    }); 

    return deferred.promise; 
} 

와 컨트롤러의 사용 각도 promise의 장점을 사용하여, 당신은 귀하의 서비스 방법은 post이고 귀하는 save이라는 메서드를 호출하고 있습니다. 그게 실수 야? 둘째, $http 서비스를 사용해야하는 이유가 없습니다. 서비스 수준이 낮고 요청이 간단합니다. 체크 아웃해야합니다 $resource 더 높은 수준의 추상화를 제공하고 당신 같은 간단한 요청을 위해 작동합니다. 자, 문제에. $http$resource은 항상 약속을 반환합니다. 따라서 일반적으로 서비스 또는 컨트롤러에서는 요청에서받은 응답을 처리하고 처리하는 콜백을 제공합니다. $ resource 및 $http에 대한 접근 방식이 비슷하기 때문에 $http에 대해 묻는 질문에 $http을 사용하겠습니다.

function post(objectTypeId, damageDescription) { 
return $http.post(serviceAddress + "save/" + objectTypeId + "/" + damageDescription); 
} 

이제 컨트롤러에서 서비스 메서드 post()을 이와 같이 호출합니다.

damageTypesService.post(inspection2update.ObjectTypeId, self.dType).then(mycallback); 


function myCallback(response){ 
    inspection2update.DamageTypeId = response; // DamageTypeId now won't be populated until the request is resolved. 
} 
+0

나는 그것을 얻기 위해 나의 예제에서 그것을 사용하려고한다. 그리고 그것은 dosent 일이다. – Michael

+0

당신의 예를위한 코드를 이러한 변경으로 제공 해주라. 그리고 "그것이 효과가 없다"는 것을 설명하십시오. 어떤 오류가 발생합니까? –