AngularJS资源承诺

Tho*_*ons 73 promise angularjs angular-resource

我有一个使用$ resource的简单控制器:

 var Regions = $resource('mocks/regions.json');

 $scope.regions = Regions.query();
Run Code Online (Sandbox Code Playgroud)

我在指令中使用这个控制器(在链接函数中)

var regions = scope.regions;
Run Code Online (Sandbox Code Playgroud)

但是地区是不确定的.调用是异步的,这是相当逻辑的.

我的问题是如何才能等待结果和区域成为包含所有数据的数组?

UPDATE : 
Run Code Online (Sandbox Code Playgroud)

这里是指令的定义

app.directive('ngMap', function() {
  return {
    restrict: 'EA',
    replace: 'true',
    scope: {

    },
    template: '<div id="map"></div>',
    controller: 'AccordMapCtrl',
    link: function(scope, element, attrs) {
      var regions = scope.regions;
      console.log(regions);

      for (var region in regions) {}
    };
  });
Run Code Online (Sandbox Code Playgroud)

小智 184

如果你想使用异步方法,你需要使用$ promise的回调函数,这里是例子:

var Regions = $resource('mocks/regions.json');

$scope.regions = Regions.query();
$scope.regions.$promise.then(function (result) {
    $scope.regions = result;
});
Run Code Online (Sandbox Code Playgroud)

  • 为什么要做两个中间任务?如果,正如我所料,`Regions`没有在别处使用,那么`resource('mocks/regions.json').query().$ promise.then(function(result){$ scope.regions = result;}) ;`肯定会做这个工作. (32认同)
  • 在调试代码时,有助于进行中间分配 (18认同)
  • 来自 $resource 文档: ...调用 $resource 对象方法会立即返回一个空引用...这是一个有用的技巧,因为通常资源被分配给一个模型,然后由视图呈现。拥有一个空对象会导致没有渲染,一旦数据从服务器到达,对象就会填充数据,并且视图会自动重新渲染自身以显示新数据。 (2认同)

Mah*_*bub 36

如果您希望在资源调用中获得承诺,则应该使用

Regions.query().$q.then(function(){ .... })

更新:在读取的当前版本中更改了promise语法

Regions.query().$promise.then(function(){ ..... })

那些被投票的人不知道它是什么以及谁首先将这个承诺添加到资源对象中.我在2012年末使用此功能 - 是2012年.


小智 20

你也可以这样做:

Regions.query({}, function(response) {
    $scope.regions = response;
    // Do stuff that depends on $scope.regions here
});
Run Code Online (Sandbox Code Playgroud)

  • 然而,这是回调语法正确,而不是承诺? (9认同)