angularjs - 在调用服务函数时使用控制器promise

时间:2015-11-12 17:21:16

标签: angularjs ajax

我有一个基本控制器,我注入了一个名为Uom的服务。我按照以下方式从我的控制器调用该服务:

Uom.get_measurement_unit_conversions().then( function( measurement_unit_conversions ) {
    // Do some stuff here
});

我的服务看起来像......

angular.module('uomService', [])

.factory('Uom', function( $http ) {

return {

    /**
     * Will make a call to the restful API to get the 
     * measurement unit conversions and then return the formatted data.
     *
     * @return {float} Converted value
     */
    get_measurement_unit_conversions: function()
    {
        var conversions = {};

        $http({ method: 'GET', url: '/api/measurement_unit_conversions' })
        .then( function( response ) {

            angular.forEach( response.data.measurement_unit_conversions, function( object, key ) {

                if( conversions.hasOwnProperty( object.source_measurement_unit_id ) == false )
                {
                    conversions[object.source_measurement_unit_id] = {};
                }

                conversions[object.source_measurement_unit_id][object.target_measurement_unit_id] = object.formula;
            });

            return conversions;
        });
    }
}
});

但我一直收到错误

Uom.get_measurement_unit_conversions(...)。那么不是函数

我从另一个堆栈溢出问题中接受了我的方法

What is the best practice for making an AJAX call in Angular.js?

知道我做错了吗?

2 个答案:

答案 0 :(得分:1)

这里有几个问题 - 首先,请注意您的get_measurement_unit_conversions函数实际上并没有返回任何内容。 return语句位于then块中,但服务函数本身返回undefined。正如Charles所说,你必须从$http(...)返回结果。

另一个问题是,为了承诺链接'要工作,您需要从then函数返回一个承诺。

以下是应该工作的服务的修改版本(要小心,未经测试)。请注意,我注入了$ q服务,以便使用$q.when(),它在新的承诺中包含任意值:

angular.module('uomService', [])
.factory('Uom', function( $http, $q ) {

    return {

    /**
     * Will make a call to the restful API to get the 
     * measurement unit conversions and then return the formatted data.
     *
     * @return {float} Converted value
     */
    get_measurement_unit_conversions: function()
    {
        return $http({ method: 'GET', url: '/api/measurement_unit_conversions' })
        .then( function( response ) {
            var conversions = {};
            angular.forEach( response.data.measurement_unit_conversions, function( object, key ) {

                if( conversions.hasOwnProperty( object.source_measurement_unit_id ) == false )
                {
                    conversions[object.source_measurement_unit_id] = {};
                }

                conversions[object.source_measurement_unit_id][object.target_measurement_unit_id] = object.formula;
            });
            return $q.when(conversions);
        });
    }
}
});

答案 1 :(得分:0)

你必须返回$ http调用,因为这会返回一个promise。

return $http(...)