2013-10-27 4 views
0

저는 AngularJS의 약속 개념으로 머리를 감싸려고합니다.각도로 약속을 올바르게 사용하십시오.

올바른 트랙에 다음 코드가 있습니까? 그리고 누군가가 PlateCheckService.checkPlate 방법을 설명 할 수 있었고 내가 약속을 되풀이하지 않는 이유는 무엇입니까? return $http.post().thenmessagealertClass 인 개체의 내부 반환이 작동하지 않는 이유는 무엇입니까? 나는 그것이 사슬로 묶인/내적 약속이라고 생각하니?

/// <reference path="angular.js" /> 
(function() { 
"use strict" 

var app = angular.module('cs'); 

app.service('PlateCheckService', ['$http', function ($http) { 
    return { 
     checkPlate: function (plateNumber) { 
      return $http.post('PlateCheck/Index', { 
       plateNumber: plateNumber 
      }).then(function (response) { 
       return { 
        message: response.data.VehicleAtl === null ? 'Clean' : 'Hot', 
        alertClass: response.data.VehicleAtl === null ? 'alert-success' : 'alert-danger' 
       } 
      }); 
     } 
    } 
}]); 

app.controller('PlateCheckCtrl', ['$scope', 'PlateCheckService', function ($scope, PlateCheckService) { 
    var plateCheck = { 
     plateNumber: '', 
     message: '', 
     alertClass: '', 
     checkPlate: function (plateNumber) { 
      var _this = this; 

      PlateCheckService.checkPlate(plateNumber).then(function (response) { 
       _this.message = response.message; 
       _this.alertClass = response.alertClass; 
      }); 
     } 
    }; 

    $scope.plateCheck = plateCheck; 
}]); 

}()); 

답변

1

예, 이것은 연결된 약속 때문입니다. then에 대한 호출은 그것이 둘러싸는 함수가 호출되기 전에 약속을 반환한다는 것을 기억하십시오.

여기에서 귀하의 전화 번호는 PlateCheckService.checkPlate(plateNumber)입니다. 그러면 연락 약속이 반환 될 것입니다. 그러나 서비스의 then 동봉 된 함수가 약속을 반환하지 않습니다. 따라서 일단 해결되면 체인에 then 기능을 부여하지 못합니다.

다음과 같은 사이비 코드와이를 시각화 할 수 있습니다 :

$http.get('url') 
    .then(function(response) { 
     return aPromise; 
    }) 
    .then(function(aPromiseResponse) { 
     return bPromise; 
    }) 
    .then(function(bPromiseResponse) { 
     return cPromise; 
    }) 
    .then(function(cPromiseResponse) { 
     // when scope is available 
     $scope.bindToMe = cPromiseResponse.value; 
    }); 

당신이 서비스에서 약속 체인에 기능을 추가 할 경우, 랩 된 약속 기능뿐만 아니라 약속을 반환 할 필요가있다.

가장 쉬운 방법은 $q.when입니다. $q.when은 객체가 약속이 아닌 경우 객체를 약속으로 래핑합니다. 개체가 이미 사용 가능한 경우 (예 : $q.when) 즉시 해결됩니다. $q.when에 대한 문서는 here입니다.

return $q.when({ 
      message: response.data.VehicleAtl === null ? 'Clean' : 'Hot', 
      alertClass: response.data.VehicleAtl === null ? 'alert-success' : 'alert-danger' 
     }); 
:

그래서, 당신은 서비스에이를 사용하여 작동하도록 코드를 얻을 수 있어야합니다

관련 문제