Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/453.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript AngularJS等待$resource响应以设置值_Javascript_Angularjs_Angular Promise_Angular Resource_Angularjs Ng Resource - Fatal编程技术网

Javascript AngularJS等待$resource响应以设置值

Javascript AngularJS等待$resource响应以设置值,javascript,angularjs,angular-promise,angular-resource,angularjs-ng-resource,Javascript,Angularjs,Angular Promise,Angular Resource,Angularjs Ng Resource,我的问题是: 我有一个使用$resource和控制器创建的服务;控制器调用服务,我尝试在收到响应(实际上是错误)后设置一个值。问题是:我试图在回调之外设置该值。服务内容如下: app.factory("DataService", function ($resource, ENV) { return $resource(ENV.apiEndpoint + "/endpoint/:id", {id:'@id'}, { update: { method: 'PUT' }

我的问题是:

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

app.factory("DataService", function ($resource, ENV) {
    return $resource(ENV.apiEndpoint + "/endpoint/:id", {id:'@id'}, {
        update: { method: 'PUT' }
    });
});
这是一个通过REST端点从后端检索数据的简单服务

这是控制器:

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" };
        });
    };
});
命令要求按以下方式调用get()方法:

类对象或实例对象上的操作方法可以是 使用以下参数调用:

HTTP GET "class" actions: Resource.action([parameters], [success], [error])
由于我的后端尚未实现,因此在调试时,我正确地执行了错误回调函数。但是我可以看到我的数据变量仍然没有定义

我的问题是我还不太习惯承诺。我知道数据服务的响应是异步的。因此,我尝试用几种不同的方法设置数据,但没有成功。我试过:

  • 要将initData方法替换为:

    ctrl.initData = function () {
        ctrl.getData().then(function () {
            ctrl.data = ctrl.initialData;
        }).catch(function () {
            ctrl.data = ctrl.initialData;
        });
    };
    
    但我从未进入“捕获”状态

  • 要使用$q服务,请执行以下操作:

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

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

我可以通过直接在回调函数中设置
数据
来实现,但这意味着我每次调用
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
函数以返回承诺

ctrl.getData = function() {
    return DataService.get({}).$promise.then(
        function(response) {
            return ctrl.initialData = response.content;
        },
        function(error) {
          return ctrl.initialData = { data1: "A" };
        });
};
然后你可以将它与
一起使用

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

您的
getData
现在不返回任何内容,因此您可以将其与
$q
等一起使用,并且angular中的资源具有属性
$promise
,您可以使用该属性。您需要通过promises传递参数,例如res或data,它表示前面语句的返回值