首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >angularjs -在调用服务函数时承诺使用控制器

angularjs -在调用服务函数时承诺使用控制器
EN

Stack Overflow用户
提问于 2015-11-12 17:21:16
回答 2查看 711关注 0票数 0

我有一个基本控制器,将一个名为Uom的服务注入其中。我从我的控制器调用服务如下:

代码语言:javascript
复制
Uom.get_measurement_unit_conversions().then( function( measurement_unit_conversions ) {
    // Do some stuff here
});

我的服务看起来..。

代码语言:javascript
复制
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(...).then不是一个函数

我的方法是从另一个堆栈溢出问题开始的。

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

知道我做错了什么吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-12 17:56:17

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

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

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

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2015-11-12 17:30:47

您必须返回$http调用,因为这将返回一个承诺。

代码语言:javascript
复制
return $http(...)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33677465

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档