使用 AngularJS 中的 promises 在视图中设置数据,然后在后台处理数据后更新视图

Using promises in AngularJS to set data in view, then update view after data processed in background

我有一个项目,我从数据库中获取数据并且必须遍历返回的对象树来操作数据,并且由于这些操作非常耗时(大量数据),它会影响页面加载次。

原始-未处理的数据是有用的,所以我想用未处理的数据设置$scope.data对象,然后在处理完成后替换它。

我在想这样的事情:

dataFactory.getAssets()
    .success(function(data) {
        $scope.assets = data; /* sets data in view */
    }
})

.then(function(data) {
    dataFactory.processAssets(data); /* post-processes data*/
    $scope.assets = data; /* sets processed data in view */
})

.error(function(data) {
    $log.log(data.error + ' ' + status);
});

我显然在这里遗漏了一些东西,我们将不胜感激。

基本上我想这样做:

  1. 从数据库中获取数据
  2. 设置 $scope.view = 数据以在页面上显示原始数据
  3. 在页面正在处理时发送要在后台处理的数据 已查看
  4. 处理完成后将 $scope.view 重置为 = 已处理数据

dataFactory.processAssets 应该 return 一个承诺,并在这个承诺解决后重置视图:

 dataFactory.getAssets().then(function(rawData){

     //get raw data and set to assets
     $scope.assets = rawData;

     //process data
     dataFactory.processAssets(rawData).then(function(data){

         //get processed data and set to assets
         $scope.assets = data
     })
 })

这样试试:

dataFactory.getAssets()
  .then(function(data) {
    $scope.assets = data; /* sets data in view */
  }, function(data) {
    $log.log(data.error);
  })
  .finally(function(data) {
    dataFactory.processAssets(data).then(function(data){
      $scope.assets = data; /* post-processes data*/
    });
  });

函数与承诺,return数据到处理函数。

dataFactory.getAssets()
    .then(function onFulfilled(data) {
        $scope.assets = data; /* sets data in view */
        //return data for chaining
        return data;
    }
})

.then(function chainedHandler(chainedData) {
    var processedData = dataFactory.processAssets(chainedData);
    $scope.assets = processedData; /* sets processed data in view */
    //return for further chaining
    return processedData;
})

.catch(function onRejected(errorResult) {
    $log.log(errorResult.error + ' ' + status);
});

请注意 .success.error 弃用 并且 忽略 return 值。 请改用 .then.catch 方法,尤其是当您打算 chain promises 时。

The $http legacy promise methods .success and .error have been deprecated. Use the standard .then method instead.1

因为调用承诺的 .then 方法 return 是一个新的派生承诺,所以很容易创建承诺链。可以创建任意长度的链,并且由于一个 promise 可以用另一个 promise 解决(这将进一步推迟其解决),因此可以 pause/defer 在链中的任何点解决 promise。这使得实现强大的 API 成为可能。2

有关详细信息,请参阅