AngularJs $ q.defer()不起作用

tra*_*jce 5 javascript promise angularjs

我遇到了一些问题$q.defer();
当我使用回调时,我的代码正在运行(视图已更新),但$q.defer();事实并非如此.

这是我的代码:
服务:

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;
        }
    };
});
Run Code Online (Sandbox Code Playgroud)

控制器:

eventsApp.controller('EventController', 
    function EventController($scope, eventData) {
        $scope.event = eventData.getEvent();
    }
);
Run Code Online (Sandbox Code Playgroud)

但它不起作用.

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

eventsApp.controller('EventController', 
    function EventController($scope, eventData) {
        eventData.getEvent().then(function(result) {
           $scope.event = result;
        });
    }
);
Run Code Online (Sandbox Code Playgroud)

它的工作原理.
非工作代码和工作代码之间有什么区别?

Ben*_*aum 11

非工作代码使用自动承诺展开,在最近的Angular版本中已弃用和删除.它被认为太神奇了.

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

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

Angular开发人员认为这种行为令人困惑和神奇,并且在Angular中被弃用(在1.2中),停用并很快(1.3)被删除.通过promise分配值的正确方法就像您在第二个示例中指出的那样:

eventData.getEvent().then(function(result) {
    $scope.event = result;
});
Run Code Online (Sandbox Code Playgroud)

来自Angular 1.3(待定)发布文档:

$ parse:由于fa6e411d,承诺解包已被删除.它自1.2.0-rc.3起已被弃用.它无法再打开.删除了两种方法:

并从1.2发布文档:

$ parse和模板一般不会自动解包promises.

之前:

$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.