AngularJS - 无法获得$ q.reject并开始工作

时间:2015-10-05 17:34:02

标签: javascript ajax angularjs promise angular-promise

看看我的代码示例:

我已经将它剥离到(我相信的)基本要素,并且我设置了错误deferred.reject is not a function

angular
    .module('myApp')
    .service('myService', MyService);

MyService.$inject = ['$http', '$q'];

function MyService($http, $q) {
    var self = this;

    self.getResult = getResult;

    function getResult(id) {
        var deferred = $q.defer();

        deferred = $http.get('my/api/method', { params: { id: id } })
            .then(getResultCompleted)
            .catch(getResultFailed);

        function getResultCompleted(response) {
            if (response.data.ID > 0) {
                deferred.resolve(response.data);
            } else {
                deferred.reject(response);
            }
        }

        function getResultFailed(response) {
            deferred.reject(response);
        }

        return deferred.promise;
    }
}

注意:我知道我可以通过简单地返回$ http调用的结果来实现这一点,但是为了理解这些promise对象,我想知道我是否可以得到这个通过声明并返回deferred进行工作,如上所示

谢谢!

2 个答案:

答案 0 :(得分:3)

您正在创建自定义承诺并从您的方法返回它,但在处理它时意味着您使用deferred覆盖$http.get(自定义承诺对象),这也会返回具有{{1的承诺}& .then方法(没有.catch& resolve方法)。由于该分配,您无法从reject对象访问.resolve.reject

deferred

应该只是

deferred = $http.get('my/api/method', { params: { id: id } })

答案 1 :(得分:1)

由于$http.get()返回promise并且成功回调支持链接API,您可以在回调中定义新的延迟对象并从那里返回:

angular
    .module('myApp')
    .service('myService', MyService);

MyService.$inject = ['$http', '$q'];

function MyService($http, $q) {
    var self = this;

    self.getResult = getResult;

    function getResultCompleted(response) { // Tip: Define callback outside of getResult in order to avoid creating new instance of it each time getResult is called
        var deferred = $q.defer();
        if (response.data.ID > 0) {
            deferred.resolve(response.data);
        } else {
            deferred.reject(response);
        }
        return deferred.promise;
    }

    function getResult(id) {
        return $http.get('my/api/method', { params: { id: id } })
            .then(getResultCompleted);
    }
}

注意,不再有错误回调(因为在这种情况下它是多余的)。

如果请求失败,将返回$http.get()的原始拒绝承诺,否则成功回拨的全新承诺将用于后续.then()来电。