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

arm*_*ong 2 promise angularjs 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();
        }
    }]);
Run Code Online (Sandbox Code Playgroud)

但是这两种方法IndexManageService不断显示以下错误消息:

deferred.promise 不是函数

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

Mis*_*lis 5

正如你的错误所说,promise in not a function。

getUrlByObjectId()功能上,更改:

return deferred.promise();
Run Code Online (Sandbox Code Playgroud)

return deferred.promise;
Run Code Online (Sandbox Code Playgroud)