Angular同步http循环更新进度条

2024-02-21

我正在尝试使用 foreach 内的顺序 http 请求来更新进度条,这可行,但它在完成时不同步,进度条正在通过 http 调用同步,我做错了什么?

angular.forEach(queue, function (item) {
    if (item.uid) {
        d.item = item;
        $http({
            url: BASE_URL + 'upp', 
            method: 'post',
            data: d                  
        }).then(function(res){
            x++;
            update_progress((x/queue_count)*100);
        });
    }
});

我想在 http 返回完成(200 OK)时调用 update_progress 函数,以便进度条正确显示实际进度。谢谢!

Edit:

我尝试在调用 *update_progress* 函数之前检查响应状态,但它仍然无法按预期工作。我不知道在请求完成之前发送了 200 条信息:|按逻辑来说,resobj 不应该是responsehttp请求的?我的意思是,如果它是 200 并且不是错误代码,那不应该意味着请求已完成?

angular.forEach(queue, function (item) {
if (item.uid) {
    d.item = item;
    $http({
        url: BASE_URL + 'upp', 
        method: 'post',
        data: d                  
    }).then(function(res){
        if(res.status == 200) {
          x++;
          update_progress((x/queue_count)*100);
        }
    });
}

阅读有关 Promise atm 的更多内容,看看我是否可以按照 @josh-strange 的说明使其工作

Edit 2:

所以 Promise 就是实现这一点的方法,所有请求都按顺序发送,以便进度条按预期工作,代码如下:

var promise = $q.all({}); 
// Had to init $q.all with an empty obj, 'cause null was trowing errors

angular.forEach(queue, function(item){
  if (item.uid) {        
    promise = promise.then(function(){
      d.item = item;
      return $http({
        url: BASE_URL + 'upp', 
        method: 'post',
        data: d 
      }).then(function(res){
        x++;
        update_progress((x/queue_count)*100);
      });
    });
  }
});

promise.then(function(){
  end_js_update();
});

谢谢@josh-strange


这是一个工作Plunker http://plnkr.co/edit/yHW3GZks0xabEERX0pv2?p=preview顺序 http 请求的工作示例。显然,您可以将其很好地打包在服务中,但出于您的目的,我只是将其简单的示例放在控制器中。

这是代码的“核心”:

var app = angular.module('testApp',[]);

app.controller('myController', function($scope, $http, $q){

  $scope.responses = [];
  $scope.doneLoading = false;
  var urls = [
    'http://httpbin.org/ip',
    'http://httpbin.org/user-agent',
    'http://httpbin.org/headers'
  ];

  var promise = $q.all(null);

  angular.forEach(urls, function(url){
    promise = promise.then(function(){
      return $http({
        method: 'GET', 
        url:url 
      }).then(function(res){
        $scope.responses.push(res.data);
      });
    });
  });

  promise.then(function(){
    //This is run after all of your HTTP requests are done
    $scope.doneLoading = true;
  })

});

编辑:正如 Mike P 所说:这是链接承诺的一个例子,请参阅$q 文档 http://docs.angularjs.org/api/ng.%24q.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Angular同步http循环更新进度条 的相关文章

随机推荐

  • Qt 和 QMake 构建目录

    我想从源代码树中构建 qt 和 qt 应用程序 你知道如何使用configure和qmake从命令行设置 obj目录吗 如果我正确理解问题你应该设置对象目录 http qt nokia com doc 4 5 qmake variable
  • 替换delphi中的组件类

    我知道我在某个地方看到过一个 hack 的例子 用于定义现有 VCL 组件的自定义版本 例如TButton or TEdit 具有相同的类名 并执行一些操作 以便 DFM Streamer 实例化您的版本而不是原始版本 不幸的是 我所处的情
  • Express-session 未在浏览器中设置 cookie

    所以我正在使用express session设置 cookie 和 session 的包 它还连接到我的 MongoDB 存储来存储会话 当用户登录时 会话会很好地存储在数据库中 但是浏览器中没有cookie 我的应用程序正在运行http
  • 如何检查下拉菜单是否被禁用?

    使用 jquery 如何简单地检查它是否是只读的 这就是我正在尝试的 item keydown function event alert event keyCode if event keyCode 13 ok click if dropL
  • 获取内容:找不到路径

    我正在尝试在 PowerShell 中编写一个脚本 该脚本在 foreach 循环中读取名称中包含 example 的特定文件夹中的所有唯一文件 问题是我试图将每个文件的内容保存在变量中但没有成功 尝试使用获取内容 file它会抛出以下错误
  • 从 PHP 创建 MySQL 用户和数据库

    有没有办法使用 PHP 创建一个新的 MySQL 数据库 一个新的 MySQL 用户并授予新用户对新数据库的权限 EDIT 应该指出 这是从一台服务器运行到另一台服务器 因此服务器 A 尝试在服务器 B 上安装数据库 用户 我有这个 con
  • fetch 给出一个空的响应主体

    我有一个 React Redux 应用程序 我正在尝试向服务器发出一个简单的 GET 请求 fetch http example com api node mode no cors method GET headers Accept app
  • 如何使用 Corda Vault Extension 创建自定义架构

    从 Corda 文档来看 我们可以在 Vault Extension 中拥有自定义架构 然而 Vault Extension 并没有太多明确性 它应该能够创建 管理与节点Vault数据库相关的自定义数据库模式 我们是否会在 Corda 的功
  • App Engine Flex 的默认 VPC 防火墙规则是什么

    我在一个 App Engine 灵活环境项目中部署了一些服务 服务实例在同一个 VPC 网络 非默认 中运行 该网络在其指定的 VPC 网络中指定 app yaml文件和分配的 IP 地址来自同一子网 默认情况下 这两个服务都可以从外部访问
  • aspx页面重定向到新页面

    将浏览器重定向到包含 ASPX 页面的新页面所需的代码是什么 我在我的页面 default aspx 上尝试过此操作 or 这些导致了未确定的服务器错误 我看不到错误代码 因为服务器不在我的控制范围内 错误也不公开 请提供从页面第一行到末尾
  • 从 UICollectionViewCell 传播自定义事件

    我有一个自定义的 UICollectionViewCell 里面有一个按钮 当我点击按钮时 会在该子类中触发一个事件 然后我想在 UICollectionView 本身上触发一个事件 我可以在视图控制器中处理该事件 伪代码 class My
  • 在 Visual Studio 中关闭 WCF 服务主机[重复]

    这个问题在这里已经有答案了 可能的重复 如何防止 Visual Studio 在调试中启动 Wcf SvcHost exe https stackoverflow com questions 283145 how to prevent vi
  • 按下/松开 WPF 按钮时触发事件

    我需要在按下 WPF 按钮 通过鼠标 键盘 触摸屏等 时触发一些事件 并在未按下 WPF 按钮时触发事件 这个怎么做 这应该很容易 但我找不到如何做到这一点 您可以从 Button 派生并覆盖按下时更改 http msdn microsof
  • 将 pandas dataframe 转换为内存中类似文件的对象?

    我每天都会将大约 2 250 万条记录加载到 Postgres 数据库中 然后 我使用 pd read sql 读取这些数据 将其转换为数据帧 然后进行一些列操作和一些小的合并 我将修改后的数据保存为单独的表以供其他人使用 当我执行 pd
  • 数据库查询表示模拟 Windows 共享上的文件?

    有没有办法让某些东西看起来就像 Windows 文件共享上的文件 但实际上是通过 HTTP 提供的资源 对于上下文 我正在使用一个只能处理 Windows 文件共享上的文件的旧应用程序 我想创建一个简单的基于 HTTP 的服务来动态地提供文
  • 为什么我无法在 Angular 2 组件中加载谷歌地图?

    这是我的 ts 组件 import Component OnInit Output EventEmitter from angular core declare var google any Component selector app r
  • Chrome webtools 调试器自行恢复脚本执行

    我在 Chrome 开发工具中看到了奇怪的行为 我在 JavaScript 中设置了一个断点 然后断点命中并停止执行 代码窗口显示了我的代码中的断点所在的点 该窗口具有淡黄色背景颜色 然后 5 秒后执行自动神奇地恢复 而无需我告诉它 以前有
  • Angular 2 - 什么相当于 Root Scope?

    全部 我有这个组件 当我单击 href 时 如果它是 Angular 1 则应该将变量设置为根范围 如下所示 selector my component template div constructor this addTag functi
  • 在C中将十进制转换为二进制

    我正在尝试将十进制转换为二进制 例如 192 到 11000000 我只需要一些简单的代码来执行此操作 但到目前为止我的代码不起作用 void dectobin int value char output int i output 5 0
  • Angular同步http循环更新进度条

    我正在尝试使用 foreach 内的顺序 http 请求来更新进度条 这可行 但它在完成时不同步 进度条正在通过 http 调用同步 我做错了什么 angular forEach queue function item if item ui