【问题标题】:"$q defered.promise is not a function" error in AngularJSAngularJS 中的“$q defered.promise 不是函数”错误
【发布时间】:2017-02-24 07:08:37
【问题描述】:

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

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 的这两种方法一直显示以下错误消息:

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

【问题讨论】:

  • 只需从 deferred.promise() 中删除括号 '()'

标签: angularjs promise angular-promise


【解决方案1】:

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

getUrlByObjectId()函数中,更改:

return deferred.promise();

return deferred.promise;

【讨论】:

  • 对此表示赞同,但如果您可以编辑答案并包含其他错字,请接受此作为答案,谢谢。
  • @armnotstrong 由于您已经修复了问题代码中的错字,我建议您就好像它从未存在过一样;P
  • 这很聪明;P
【解决方案2】:

我只是在您的 getUrlByObjectId() 方法中将 promise() 替换为 promise。它会工作的。

延迟对象:

Deferred 是一个暴露 Promise 的对象。它主要有三个 方法resolve()、reject()和notify()。延期退货承诺 目的。当 Deferred 完成时,您调用方法或者 resolve(), 拒绝()和通知()。它调用回调寄存器 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;
    }
}]);

【讨论】:

    【解决方案3】:

    您的 promise 用法可能会完全避免该问题。你根本不需要延迟对象!

    merchant.service('IndexManageService', ['$http', '$q', function($http, $q) {
      this.getObjectIdByUrl = function(url) {
        if (!(/.*ababab.com.*/.test(url))){
          return $q.reject(new Error("url not correct"));
        }
        return getAPI('/getObjectIdByUrl?url=' + url).then(function(data) { 
          return "http://cdnimg.gifmiao.com/" + data.url;
        });
      };
      this.getUrlByObjectId = function(id){
        return getAPI('getUrlByObjectId?id=' + id).then(function(data) {
          return data.id;
        });
      }
      function getApi(url) {
        return $http.get("/api" + url).then(function(res) {
          if(res.data.status !== 0) throw new Error(res.msg);
          return res.data.data;
        }, function(res) { throw new Error(res.status); });
      }
    }]);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-13
      • 2015-08-07
      • 1970-01-01
      • 1970-01-01
      • 2017-12-03
      • 2016-04-18
      • 2015-11-07
      相关资源
      最近更新 更多