javascript - AngularJS 等待 $resource 响应设置值

标签 javascript angularjs angular-promise angular-resource angularjs-ng-resource

这是我的问题:

我有一个用 $resource 创建的服务和一个 Controller ; Controller 调用服务,我尝试在收到响应(实际上是错误)后设置一个值。问题是:我试图在回调之外设置该值。这是服务:

app.factory("DataService", function ($resource, ENV) {
    return $resource(ENV.apiEndpoint + "/endpoint/:id", {id:'@id'}, {
        update: { method: 'PUT' }
    });
});

这是一个简单的服务,通过 REST 端点从后端检索数据。

这是 Controller :

app.controller("DataController", function (DataService){
    var ctrl = this;
    ctrl.initialData = undefined;
    ctrl.data = undefined;

    ctrl.initData = function () {
        ctrl.getData();
        ctrl.data = ctrl.initialData;
    };

    ctrl.getData = function () {
        DataService.get({},
            function (response) {
                ctrl.initialData = response.content;
        }, function (error) {
                ctrl.initialData = { data1: "A" };
        });
    };
});

Angular $resource Doc说要这样调用 get() 方法:

The action methods on the class object or instance object can be invoked with the following parameters:

HTTP GET "class" actions: Resource.action([parameters], [success], [error])

由于我的后端尚未实现,因此在调试时,我正确地执行了错误回调函数。但我可以看到我的数据变量仍未定义。

我的问题是我仍然不太习惯 promise 。我知道来自 DataService 的响应是异步的。所以我尝试以几种不同的方式设置数据,但都没有成功。我试过:

  • 将 initData 方法替换为:

    ctrl.initData = function () {
        ctrl.getData().then(function () {
            ctrl.data = ctrl.initialData;
        }).catch(function () {
            ctrl.data = ctrl.initialData;
        });
    };
    

    但我从来没有进入'catch'条件;

  • 要使用 $q 服务:

    ctrl.initData = function () {
        $q.all([ctrl.getData()]).then(function () {
            ctrl.data = ctrl.initialData;
        });
    };
    
  • 使用 $q.when 从变量 ctrl.data 创建 promise :

    ctrl.billingInfo = $q.when(/*???*/);
    
  • 那些的其他变体..

我可以通过直接在回调函数中设置 data 来让它工作,但这意味着我每次调用 getData() 方法时都会重置数据,而且出于最佳实践目的,我想避免的事情:

ctrl.getData = function () {
    DataService.get({},
        function (response) {
            ctrl.initialData = response.content;
            ctrl.data = ctrl.initialData;
    }, function (error) {
            ctrl.initialData = { data1: "A" };
            ctrl.data = ctrl.initialData;
    });
};

有没有办法在设置ctrl.data之前等待ctrl.initialData被设置?

非常感谢任何一点帮助

最佳答案

你可以稍微修改一下 getData 函数来返回 promise

ctrl.getData = function() {
    return DataService.get({}).$promise.then(
        function(response) {
            return ctrl.initialData = response.content;
        },
        function(error) {
          return ctrl.initialData = { data1: "A" };
        });
};

然后你可以像then一样使用它

ctrl.initData = function () {
    ctrl.getData().then(function(initialData){
        //success callback
        ctrl.data = initialData;
    },function(initialData){
        //error callback
        ctrl.data = initialData;
    });
};

关于javascript - AngularJS 等待 $resource 响应设置值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33043482/

相关文章:

javascript - Angular JS 中的 JWT token 存储

javascript - Firebase 未定义?

AngularJS promise 不会使用 $interval 多次解决

javascript - Flash CC html5 canvas播放动画

javascript - 从服务获取 ng-patten 作为变量

php - 如何捕获并记录生产网站中的每个 PHP 和 JS 错误?

javascript - Angular $http 然后解析 _.each 中的多个调用

javascript - 取消 Angular 服务 promise

javascript - 使用正则表达式将段落拆分为javascript中的句子

javascript - 使用文档参数自调用匿名函数