AngularJS承诺未定义

wyl*_*ard 0 javascript angularjs angular-promise

我已经在网上阅读了几个关于SO的例子,但是我仍然遗漏了一些东西.

我有一项服务从我的API获取订单数据.我想解决服务中的承诺.服务中的console.log记录正确的数据.

但是,在我的控制器中我得到"TypeError:无法读取属性"然后"未定义"

我以为控制器功能会等待数据被解析?

服务

angular.module('app')
.factory('orderService', function($http) {

    // DECLARATIONS
    var baseUrl = 'http://api.example.com/';
    var method = 'GET';
    var orderData = null;

    return {
        getOrderData: getOrderData
    };

    // IMPLEMENTATIONS
    function getOrderData(ordernumber) {        
        // order data does not yet exist in service
        if(!orderData) {
            dataPromise = $http({
                url: baseUrl + 'order/' + ordernumber,
                method: method,
                withCredentials: true,
                headers: {
                    'Content-Type': 'application/json'
                }
            // success
            }).then(function(response) {
                orderData = response.data;
                console.log('Received data: ' + JSON.stringify(response.data));
                return orderData;               
            },
            // faliure
            function(error) {
                  console.log("The request failed: " + error);
            });
        // order data exist in service
        } else {
            console.log('Data present in service: ' + orderData);
            return orderData;
        }
    } // end: getOrderData function
}); // end: customerService
Run Code Online (Sandbox Code Playgroud)

调节器

app.controller('orderController', function($scope, $stateParams, orderService) {

   $scope.ordernumber = $stateParams.order;

   orderService.getOrderData($scope.ordernumber)
    // success 
    .then(function(response) {
        $scope.order = response;
        console.log('Controller response: ' + response);
    },
    // faliure
    function(error) {
      console.log("The request failed: " + error);
    });
});
Run Code Online (Sandbox Code Playgroud)

Yor*_*lov 5

你的功能getOrderData没有回复承诺

function getOrderData(ordernumber) {        
   var deferred = $q.defer();
        // order data does not yet exist in service
        if(!orderData) {
            dataPromise = $http({
                url: baseUrl + 'order/' + ordernumber,
                method: method,
                withCredentials: true,
                headers: {
                    'Content-Type': 'application/json'
                }
            // success
            }).then(function(response) {
                orderData = response.data;
                console.log('Received data: ' + 
                 JSON.stringify(response.data));
                deferred.resolve(orderData);               
            },
            // faliure
            function(error) {
              deferred.reject(error);
                  console.log("The request failed: " + error);
            });
        // order data exist in service
        } else {
            console.log('Data present in service: ' + orderData);
            deferred.resolve(orderData);
        }
    else {
     deferred.reject('Not set!');
   }

return deferred.promise;
    } // end: getOrderData function
Run Code Online (Sandbox Code Playgroud)

  • 但是请求之前的整个逻辑可以被称为`if(!cachedPromise)cachedPromise = ...; return cachedPromise`.并且`$ http`为您提供缓存承诺.所以你不需要为此自己创建任何承诺. (2认同)