首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AngularJs $q.defer()不工作

AngularJs $q.defer()不工作
EN

Stack Overflow用户
提问于 2014-08-23 15:18:34
回答 2查看 8.6K关注 0票数 5

我和$q.defer();有一些问题

当我使用回调时,我的代码正在运行(视图已被更新),但是使用而不是

这是我的密码:

服务:

代码语言:javascript
复制
eventsApp.factory('eventData', function($http, $q) {
    return {
        getEvent: function(callback) {
            var deferred = $q.defer();
            $http({method: 'GET', url: '/node/nodejsserver/server.js'}).
                success(function(data, status, headers, config){
                    //callback(data.event);
                    deferred.resolve(data.event);
                    console.log('status: ', status, ' data: ', data);
                }).
                error(function(data, status, headers, config){
                    deferred.reject(status);
                    console.log('status: ', status);
                });
            return deferred.promise;
        }
    };
});

控制员:

代码语言:javascript
复制
eventsApp.controller('EventController', 
    function EventController($scope, eventData) {
        $scope.event = eventData.getEvent();
    }
);

但不起作用。

然后我找到了这个答案,我更新了我的控制器如下:

代码语言:javascript
复制
eventsApp.controller('EventController', 
    function EventController($scope, eventData) {
        eventData.getEvent().then(function(result) {
           $scope.event = result;
        });
    }
);

而且起作用了。

非工作代码和工作代码的区别是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-23 15:24:44

非工作代码使用自动承诺展开,这是不推荐和删除的最新版本的角。它被认为太神奇了。

当您返回承诺时,角用于执行以下操作:

  • 返回一个空数组。
  • 稍后在请求到达时填充它。
  • 自己触发一个摘要。

这个行为被角度开发人员认为是令人困惑和神奇的,并被废弃(在1.2中),被禁用,很快(1.3)在角中被移除。通过承诺分配值的正确方法如您在第二个示例中所指出的:

代码语言:javascript
复制
eventData.getEvent().then(function(result) {
    $scope.event = result;
});

从角度1.3 (待定)释放文档:

$parse:由于fa6e411d,承诺拆开已被删除。自1.2.0-rc.3以来,它一直被废弃。它不能再打开了。已经删除了两种方法:

在1.2版本的文档中:

一般情况下,$parse和模板将不再自动解除承诺。 在此之前: $scope.foo = $http({method: 'GET', url: '/someUrl'}); <p>{{foo}}</p> 之后: $http({method: 'GET', url: '/someUrl'}) .success(function(data) { $scope.foo = data; });`` {foo} ` 这一特性已被废弃。如果绝对需要,现在可以通过$parseProvider.unwrapPromises(true) API重新启用它。

当我们在这里避免使用递延反模式时,$http已经返回了承诺,所以您可以简单地使用return而不是使用$q.defer

票数 11
EN

Stack Overflow用户

发布于 2014-08-23 15:26:46

编辑:核对本杰明的答案

在您的服务中,您将返回一个promise对象,允诺对象具有.then方法。

您将promise对象分配给$scope.event,因此您将不会获得数据(根据本杰明的说法,在最新版本中)

当您使用deferred.resolve(data.event)解析承诺时,您作为参数传递给.then方法的函数将使用此解析数据调用。

您可以向.then提供第二个参数,在执行deferred.reject()时将调用该参数

这是允诺api的基本功能。只需阅读文档以获得更多信息,https://docs.angularjs.org/api/ng/service/$q

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

https://stackoverflow.com/questions/25463411

复制
相关文章

相似问题

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