javascript - AngularJs $q.defer() 不工作

标签 javascript angularjs promise

我在使用 $q.defer();
时遇到了一些问题 当我改用回调时,我的代码正常工作( View 已更新),但使用了$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;
        }
    };
});

Controller :

eventsApp.controller('EventController', 
    function EventController($scope, eventData) {
        $scope.event = eventData.getEvent();
    }
);

但它不起作用。

然后我找到this answer我像这样更新了我的 Controller :

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

并且有效。
非工作代码和工作代码之间有什么区别?

最佳答案

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

当你返回一个 promise 时,Angular 过去常常做以下事情:

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

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

eventData.getEvent().then(function(result) {
    $scope.event = result;
});

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

$parse: due to fa6e411d, promise unwrapping has been removed. It has been deprecated since 1.2.0-rc.3. It can no longer be turned on. Two methods have been removed:

来自 1.2 版本文档:

$parse and templates in general will no longer automatically unwrap promises.

Before:

$scope.foo = $http({method: 'GET', url: '/someUrl'}); <p>{{foo}}</p>

After:

$http({method: 'GET', url: '/someUrl'})

.success(function(data) { $scope.foo = data; });``

{{foo}}

`

This feature has been deprecated. If absolutely needed, it can be reenabled for now via the $parseProvider.unwrapPromises(true) API.

当我们在这里时,避开 the deferred anti pattern , $http已经返回 promise ,所以你可以简单地 return它而不是使用 $q.defer .

关于javascript - AngularJs $q.defer() 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25463411/

相关文章:

javascript - AngularJS:模型不在 Controller 范围内更新

javascript - 无法模拟调用另一个工厂方法的工厂方法

c# - 带有 Web API 2 和 AngularJS 的 MVC5.1

javascript - 牛队列的process方法返回的promise可以忽略不计吗?

javascript - Angular 2 : Returning Promise

javascript - 如何通过Javascript访问文档cookie?

javascript - 使用 javascript 获取 CSS Transitions 的 vendor 前缀有什么问题?

javascript - js - 设置上传文件的热键

javascript - 将 Redux 与 vanilla JS 结合使用,如何在不将其传递给每个组件的情况下实现它?

javascript - 试图找出 Bluebird 执行 promise 流程的方式