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

Difference between $q.resolve() vs deferred.resolve() - AngularJS

我需要 return 来自 $http 调用的承诺中的自定义响应,以便我可以链接更多调用。我有两个可用的实现。有人可以解释一下两者之间的区别,并争论一个更好吗?

在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');
}

首选哪种方式?

您不需要 $q here at all, because $http already returns a promise.then() 中只有 return 数据,它将可用于链中的下一个 .then()

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

您执行实施的方式称为 deferred antipattern, more info in this answer