angularjs - 带有进度/通知的服务器异步请求

标签 angularjs asynchronous promise

我在设置将执行异步 http 请求的服务时遇到问题。

背景

我有一个后端端点 /cars.json 当你第一次点击这个端点时,将启动获取所有汽车信息的后台作业。然后服务器返回状态为 200 的响应:

{"status":"started", "percentage_completion":0, "data":null, "error":null}

对该端点的连续请求将继续返回状态 200 并更新 percentage_completion

{"status":"started", "percentage_completion":45, "data":null, "error":null}
{"status":"started", "percentage_completion":90, "data":null, "error":null}

最终对端点的请求会返回:

{"status":"finished", "percentage_completion":100, "data": {...}, "error":null}

我有一个数据,我可以将它添加到 $scope 中。

但我很难理解 promise 和做事的 Angular ......

我加了这样的东西:

   var dashboard = angular.module('dashboard', [                                                                                       
      'templates'                                                                                                                     
    ]);                                                                                                                                 

   dashboard.controller('dashboardController', ['carsService', '$scope',                                                          
        function(carsService, $scope){                                                                                             
          $scope.test = "Loading...";                                                                                                   
          carsService.get()                                                                                                        
            .then(function(response){                                                                                                   
              $scope.test = response.data;                                                                                              
            });                                                                                                                         
        }]                                                                                                                              
   );                                                                                                                                  

    dashboard.factory('carsService', ['$http', function($http){                                                                    
      var get = function(){                                                                                                             
        return $http.get('/cars.json');                                                                                            
      };                                                                                                                                
      return {                                                                                                                          
        get: get                                                                                                                        
      };                                                                                                                                
    }]);

它向服务器发送一个请求,并使用第一个响应说明作业已启动来更新作用域上的测试。几秒钟后刷新页面时,我会使用正确的数据和完成状态更新测试。

什么是最好的方式, Angular 方式:) promise 和东西让服务和 Controller 自动完成。

我想到的第一件事是使用 $interval 或类似的东西,并定期从 .then(success) 重新发送请求,但也许有更好的方法。

Angular 文档说明了有关进度/通知 promise 的内容,但目前我不知道如何将其连接起来。

显然我目前还没有完全理解 Promise,我只是被介绍给他们 - 你能分享一些关于如何使用 Angular 处理异步请求的技巧/资源吗?

最佳答案

我不确定我是否完全理解您的问题,但如果您希望在进度更新返回时获得更新,Angular 会在其 promise 服务中内置一个进度回调(正如您所提到的)。 .then() 中的第一个回调是你的成功回调,第二个是你的错误回调,第三个是你的进度回调。

因此,当您将回调链接到 Promise 时,您可以使用以下语法来更新进度指示器:

carsService.get()                                                                                                        
    .then(function(response){
        // success                                                                                                  
        $scope.test = response.data;
        $scope.$apply();  // or wrapped in $timeout                                      
    }, function(error){
        // error
    }, function(percentComplete){
        // progress
        $scope.progress = percentComplete;
        $scope.$apply();  // or wrapped in $timeout
    });

关于在编写和链接你的 Promise 时使用的最佳语法,John Papa 有一个很棒(而且非常深入)的风格指南,它将帮助你更好地组织你的 Angular 代码。你可以找到这个here .

这是一个示例 jsfiddle演示此通知/进度回调的实际操作。它使用超时来模拟异步调用,但很好地展示了总体思路。

还请记住,当您进行这些异步调用时,您可能需要运行 $scope.$apply()或将代码包装在回调中,您可以在 $timeout(function(){ //update data }); 中更新范围数据为了再次运行 Angular 摘要循环(异步调用会在 Angular 的内置观察程序之外更新您的数据)。这将导致您的 View 也更新,而无需重新加载页面。如果您以前从未遇到过这种行为,则可以使用很多关于此的博客文章和 SO 问题。这里是 one这很好地涵盖了它。

关于angularjs - 带有进度/通知的服务器异步请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33181123/

相关文章:

带有 `$q` 的 AngularJS 执行顺序——链接 promise

javascript - 如何从 Angular.js 中的链接函数更改模板

jquery加载回调函数失败

android - API 调用在 Anko Async 中不起作用

reactjs - Jest 模拟模块解析变量值

javascript - Promise 解决了但没有触发

ruby-on-rails - 请求的资源上不存在 'Access-Control-Allow-Origin' header

javascript - 如果我在单个 html 中有多个 ui-view,如何替换单个 ui-view

c++ - 异步 ReadDirectoryChangesW 调用阻止线程退出

javascript - d3 async wait fetch.json 不是函数