programing

$resource 서비스를 사용하는 AngularJS.GET 요청으로 약속이 해결되지 않음

magicmemo 2023. 3. 7. 21:15
반응형

$resource 서비스를 사용하는 AngularJS.GET 요청으로 약속이 해결되지 않음

다음과 같은 서비스를 예로 들어 보겠습니다.

   services.factory('User', function($resource){
        return $resource('/rest/usersettings/:username', {}, {
            get:    {method: 'GET'},
            update: {method: 'POST'}
        });
    });

따라서 다음과 같이 사용해야 합니다.

        scope.user = User.get( {username: 'bob'}  );    // GET

        console.log( JSON.stringify(scope.user) )       // {"$promise":{},"$resolved":false} 

GET 요구를 송신하면, 다음의 ur+param이 작성되어 OK가 됩니다.

http://localhost:9000/rest/usersettings/bob

질문: {"$promise":{},"$resolved":false}

GET 요구로 서버에서 json-response가 반환된 경우:{"username":"bob","email":"bob@bobs.com"}그럼 우리 집도scope.user데이터에 의해 채워집니다.

약속이 준비/해결되었으므로 기다려야 합니까?/해결되었습니까?

User.get( {username: 'bob'} )는 실제 데이터를 즉시 반환하지 않습니다.Ajax가 반환되면 데이터가 보관됩니다.그것에 대해서 (the)$promise추가 콜백을 등록하여 데이터를 기록할 수 있습니다.

코드를 다음과 같이 변경할 수 있습니다.

   scope.user = User.get( {username: 'bob'}  );    // GET
   scope.user.$promise.then(function(data) {
       console.log(data);
   });

데이터는 바로 얻을 수 없지만, 바로 얻을 수는 없습니다.ngResource 문서를 읽습니다.

$resource 객체의 메서드를 호출하면 즉시 빈 참조가 반환됩니다(isArray에 따라 개체 또는 배열).데이터가 서버에서 반환되면 기존 참조가 실제 데이터로 채워집니다.일반적으로 리소스는 뷰에서 렌더링되는 모델에 할당되므로 유용한 트릭입니다.빈 객체가 있으면 렌더링되지 않습니다.서버에서 데이터가 도착하면 객체에 데이터가 채워지고 뷰가 자동으로 재렌더되어 새로운 데이터가 표시됩니다.즉, 대부분의 경우 액션 방식의 콜백 함수를 쓸 필요가 없습니다.

지금은 이것을 사용하고 있습니다(이 질문을 반복하고 있는 것 같습니다).

User.get({
    username: 'bob'
}, function(user) {

    user.$update(
        function(data, headers) {
            console.log("GOOD");
        },
        function(err, headers) {
            console.log("BAD");
        }
    );
});

이것은 동작합니다.

User.get( {username: 'bob'} ).$promise.then(function(data) {
    scope.user = data.toJSON();
});

toJSON()은 Angular의 내부 속성($$)을 정리합니다.

언급URL : https://stackoverflow.com/questions/20008244/angularjs-using-resource-service-promise-is-not-resolved-by-get-request

반응형