首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >$q.resolve()与deferred.resolve() - AngularJS的区别

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

Stack Overflow用户
提问于 2017-10-04 08:19:51
回答 1查看 4.8K关注 0票数 0

我需要在一个承诺中从$http调用返回一个定制的响应,这样我就可以链接更多的调用。我有两个可用的实现。有人能解释一下两者之间的区别,并争论一下一个是否更好吗?

在fooService.js中

实现#1

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
fooService.foo().then(function(response) {
    // Do something
});

P.S.欢迎一些能给我更好理解的链接。

*更新2017年10月4日*

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

实现#1

代码语言:javascript
复制
function foo() {
    var deferred = $q.defer();
    if(/*some condition*/) {
        deferred.resolve('data');
        return deferred.promise;
    }
    else {
        deferred.reject('error');
        return deferred.promise;
    }
}

实现#2

代码语言:javascript
复制
function foo() {
    if(/*some condition*/)
        return $q.resolve('data');
    else
        return $q.reject('error');
}

哪一种是首选的方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-04 08:25:49

这里根本不需要$q,因为$http已经回报承诺了。只需返回.then()中的数据,链中的下一个.then()就可以使用该数据:

代码语言:javascript
复制
function foo() {
    return $http.get('some-http-url')
        .then(function(response) {
            return response.data.Data;
        });
}

您的实现方式称为https://github.com/petkaantonov/bluebird/wiki/Promise-anti-patterns#the-deferred-anti-pattern这个答案中有更多信息。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46560170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档