AngularJS中的“$ q deferred.promise不是函数”错误

时间:2017-02-23 13:55:41

标签: angularjs promise angular-promise

我已经定义了以下IndexMangeService服务,希望预先检查输入参数并在$http请求后返回一个承诺。

merchant.service('IndexManageService', ['$http', '$q', function($http, $q){
        this.getObjectIdByUrl = function(url) {
            var deferred = $q.defer();
            if (!(/.*ababab.com.*/.test(url))){
                deferred.reject("url not correct");
            }else{
                $http.get('/api/getObjectIdByUrl?url='+url).then(
                    function success(response){
                        var json = response.data;
                        if(json.status == 0){
                            deferred.resolve({id: json.data.id});
                        }else{
                            deferred.reject(json.msg);
                        }
                    },
                    function failed(response){
                        deferred.reject(response.status);
                    }
                )
            }
            return deferred.promise;
        };
        this.getUrlByObjectId = function(id){
            var deferred = $q.defer();
            $http.get("/api/getUrlByObjectId?id="+id).then(
                function success(response){
                    var json = response.data;
                    if(json.status == 0){
                        deferred.promise({
                            url: "http://cdnimg.gifmiao.com/"+json.data.url
                        })
                    }else{
                        deferred.reject(json.msg);
                    }
                },
                function failed(response){
                    deferred.reject("failed" + response.status);
                }
            );
            return deferred.promise();
        }
    }]);

IndexManageService中的这两个方法一直显示以下错误消息:

deferred.promise is not a function

在AngularJS中使用$ q我做错了什么?

2 个答案:

答案 0 :(得分:4)

正如你的错误所说,承诺不是一个功能。

getUrlByObjectId()功能中,更改:

return deferred.promise();

return deferred.promise;

答案 1 :(得分:2)

我只是在你的getUrlByObjectId()方法中用promise替换promise()。它会起作用。

延迟对象:

  

延迟是揭露承诺的对象。它主要有三个   方法resolve(),reject()和notify()。延期退货承诺   宾语。 Deferred完成后,您调用方法resolve(),   reject()和notify()。它将回调寄存器调用到   resolve(),reject()或notify()根据它的完成方式。

merchant.service('IndexManageService', ['$http', '$q', function ($http, $q) {
    this.getObjectIdByUrl = function (url) {
        var deferred = $q.defer();
        if (!(/.*ababab.com.*/.test(url))) {
            deferred.reject("url not correct");
        } else {
            $http.get('/api/getObjectIdByUrl?url=' + url).then(
                    function success(response) {
                        var json = response.data;
                        if (json.status == 0) {
                            deferred.resolve({id: json.data.id});
                        } else {
                            deferred.reject(json.msg);
                        }
                    },
                    function failed(response) {
                        deferred.reject(response.status);
                    }
            )
        }
        return deferred.promise;
    };
    this.getUrlByObjectId = function (id) {
        var deferred = $q.defer();
        $http.get("/api/getUrlByObjectId?id=" + id).then(
                function success(response) {
                    var json = response.data;
                    if (json.status == 0) {
                        deferred.promise({
                            url: "http://cdnimg.gifmiao.com/" + json.data.url
                        })
                    } else {
                        deferred.reject(json.msg);
                    }
                },
                function failed(response) {
                    deferred.reject("failed" + response.status);
                }
        );
        return deferred.promise;
    }
}]);