$ q.resolve()vs deferred.resolve()之间的区别 - AngularJS

时间:2017-10-04 08:19:51

标签: javascript angularjs promise angular-promise

我需要通过 $ http 调用在promise中返回自定义响应,以便我可以链接更多调用。我有两个实现可用。有人可以解释两者之间的区别,并争论一个更好吗?

在fooService.js

实施#1

function foo() {
    var deferred = $q.defer();
    return $http.get('some-http-url')
        .then(function(response) {
            var data = response.data.Data;
            // Some manipulation on data
            deferred.resolve(data);
            return deferred.promise;
        });
}

实施#2

function foo() {
    return $http.get('some-http-url')
        .then(function(response) {
            var data = response.data.Data;
            // Some manipulation on data
            return $q.resolve(data);
        });
}

然后在FooController.js

fooService.foo().then(function(response) {
    // Do something
});

P.S。我们欢迎一些可以让我更好理解的链接。


**************更新2017年10月4日**** **********

如果我像这样修改我的函数foo()

实施#1

function foo() {
    var deferred = $q.defer();
    if(/*some condition*/) {
        deferred.resolve('data');
        return deferred.promise;
    }
    else {
        deferred.reject('error');
        return deferred.promise;
    }
}

实施#2

function foo() {
    if(/*some condition*/)
        return $q.resolve('data');
    else
        return $q.reject('error');
}

哪种方式首选?

1 个答案:

答案 0 :(得分:2)

您根本不需要$q,因为$http已经returns a promise。 只需返回.then()中的数据,它就可用于链中的下一个.then()

function foo() {
    return $http.get('some-http-url')
        .then(function(response) {
            return response.data.Data;
        });
}

您实施的方式称为deferred antipatternthis answer中有更多信息。