AngularJS 中使用 Promise 和 Defer 进行同步和异步调用

2024-01-19

我创建了以下控制器,其中有 2 个服务调用服务。第二个响应先于第一个响应。我想做的就像我需要第一个响应,然后第二个响应。但我只是坚持异步和同步请帮我解决。

第二次调用取决于第一次调用。例如,如果第一个调用返回 10 条记录,那么我必须调用第二个 Web 服务 10 次,从第一个响应中获取 id。所以我使用 for 循环,但它不正确。

控制器

var mycompaigndata = [];

asyncService.loadDataFromUrls($http.get(WSURL + 'api/first/', 
{
    headers: 
    {
        "Authorization":'Bearer <my-token>'
    }
}))
.then(function(data)
{
    console.log(data);
});


asyncService.loadDataFromUrls($http.get(WSURL + 'api/second', 
{
    headers:
    {
        "Authorization":'Bearer <my-token>'
    }
}))
.then(function(data)
{   
    console.log(data);
});

Service

app.service('asyncService', function($http, $q) 
{
    return {
        loadDataFromUrls: function(url) 
        {
            var deferred = $q.defer();
            var urlCalls = [];

            urlCalls.push(url);

            $q.all(urlCalls)
            .then(
            function(results) 
            {
                deferred.resolve(results) 
            },
            function(errors) 
            {
                deferred.reject(errors);
            },
            function(updates) 
            {
                deferred.update(updates);
            });
            return deferred.promise;
        }
    };
});

为了确保第一个调用完成后执行第二个调用,请将第二个调用放入then第一次通话时。要根据第一个调用的结果数进行多个“第二个”调用,请使用$q.all.

asyncService.loadDataFromUrls('api/first/')
.then(function(firstData) {
    //assuming firstData is an array of 'x' items, do a call for each of these items:
    console.log('results of first call holds ' + firstData.length + ' items');
    var promises = [];
    for(var i = 0; i<firstData.length; i++){
        var id = firstData[i].id;//you can use this to pass to the second call
        promises.push(asyncService.loadDataFromUrls('api/second'));
    }
    return $q.all(promises);
})
.then(function(results) {
  //'results' is an array of results, the nth item holds the result of the 'nth' call to loadDataFromUrls
  for(var i = 0; i<results.length; i++){
    console.log('result nr. ' + i + ' :' + results[i])
  }
});

通过使用return $q.all(promises),你正在避免厄运的承诺金字塔,并保持扁平结构。

您的服务代码不再需要循环。作为旁注,您可以缩短服务的代码并避免使用“显式承诺构造反模式”(请参阅here https://stackoverflow.com/questions/23803743/what-is-the-explicit-promise-construction-antipattern-and-how-do-i-avoid-it) 像这样:

app.service('asyncService', function($http, $q) 
{
    return {
        loadDataFromUrls: function(url) 
        {
            return $http.get(WSURL + url, {
                headers: {
                  "Authorization": 'Bearer <my-token>'
                }
            }).then(function(response){ return response.data; });
        }
    };
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AngularJS 中使用 Promise 和 Defer 进行同步和异步调用 的相关文章

  • AngularJS 插值错误

    我正在显示房间的属性 作为我正在开发的房间管理应用程序的一部分 这是输出 如您所见 Beamer 英文投影仪 的值为 Sony lamp 01 12 2013 此输出是正确的 但当我打开控制台时 我看到一些有关插值的错误 更大的分辨率 Ca
  • AngularJs 数据绑定不适用于 ionic

    我觉得我在离子输入文本中遗漏了一些明显的东西 我在用angular ui router这条路线 stateProvider state findPersons url findPersons templateUrl html findPer
  • Java CreateProcess 错误=193,%1 不是有效的 Win32 应用程序

    我正在尝试读取和写入可扩展链接格式 ELF 下面是我收到错误的行 p r exec optimizer sourceFile sourceFile a all i 运行此行后 我收到如下错误 java io IOException Cann
  • 单元测试依赖注入

    我对茉莉花和业力是全新的 我相信我的环境设置正确 并且我能够运行非常基本的单元测试 但是一旦我尝试实例化控制器 我就会收到未知提供程序错误 并且我不确定如何调试它 我需要传入 stateProvider 依赖项吗 我在角种子示例中没有看到这
  • 包含routeChangeSuccess的AngularJS测试控制器

    我正在尝试创建单元测试来测试导航列表控制器 但在创建测试时遇到问题 这是控制器的代码 navListModule controller NavListCtrl scope NavList function scope NavList sco
  • 从指令动态地将角度属性添加到元素

    我正在尝试构建一个指令来更改缓慢的 ajax 调用按钮上的加载状态 基本上 这个想法是为按钮元素设置一个属性 ng loading 并让指令添加其余的内容 这是html代码
  • 导航嵌套组件时创建面包屑 (Angular 2)

    我正在为此苦苦挣扎 这个想法是有一个组件 当浏览子视图时更新面包屑 例如
  • 在角度控制器中监听文档事件

    如何捕获角度控制器中的事件 我有文档级事件 所以我需要在角度控制器中捕获事件 这可能吗 Update 我有独立的 js 文件来处理来自相机的一些操作 document addEventListener myCameraEvent handl
  • 如何销毁角度工厂实例

    一方面 我有几个工厂 每个工厂都控制一个 websocket 另一方面 其中一个工厂应该在客户端登录时启动 因此 if user isLogged injector get NotificationsWebsocket 这就是我动态初始化工
  • JavaScript 中的 Promise 有什么意义?

    一个承诺是一个 可能现在可用 或将来可用 或永远不可用的值 来源 MDN 假设我有一个想要处理图片的应用程序 图片已加载 例如在算法在后台使用它之后 或某种其他类型的延迟 现在我想检查一下图片是否可以在future 通过使用承诺 而不是回调
  • 如何清除单个函数中的所有 AngularJS $scope 和 $rootScope 值?

    我需要清除所有 scope执行某些操作时的值 例如 如果我点击 Signout 按钮重定向到 signin 页面 然后所有 scope or rootScope应清除会话中的值 我怎样才能实现这个目标 您可以执行以下操作 rootScope
  • Protractor+AngularJS+Jasmine - 测试按住项目

    AngularJS 和 Protractor 非常新 但我认为到目前为止我正在朝着正确的方向前进 我的网站有一个项目列表 当您单击该项目并按住 X 秒时 它会打开一个模式窗口 我如何在 Protractor Jasmine 中模拟这种行为
  • Javascript Promise“then”始终运行,即使 Promise 未能执行

    我希望当调用第二个 then 时不执行第三个 then 但是 即使 Promise 被拒绝 调用第二个 then 并且代码返回 rejected 然后返回 undefined 它仍然调用第三个 then 如何不运行第三个 then 这样 未
  • fetch().then() 返回内容类型和正文[重复]

    这个问题在这里已经有答案了 互联网上的每个 fetch API 示例都展示了如何使用 response json response blob 等仅返回正文 我需要的是调用一个将内容类型和主体都作为 blob 的函数 但我不知道该怎么做 fe
  • 为什么 angularjs bootstrap datepicker 选择前一天?

    我在用着AngularJS引导日期选择器指令 http angular ui github io bootstrap 当我从模型中设置日期时 它会选择所选日期之前的一天
  • 如何使用 Angularjs 检查模块中的指令或控制器是否可用

    在 angularjs 中 给定一个模块 如何检查给定一个模块是否存在指令 控制器 我有一个模块 我想知道是否已加载某些特定指令 下面是一些示例代码 var module angular module myModule check if c
  • 在单页应用程序上重用 Google Maps API 实例

    假设我有一个单页应用程序 Angular JS 应用程序 并且我在元素 id 上绘制一个 Google 地图实例googleMap var mapInstance new google maps Map document getElemen
  • 解析函数是否异步传递给 Promise 执行器?

    我有以下代码 function myPromiseFunc return new Promise resolve gt resolve Promise resolve 123 据我们所知Promise resolve方法立即用普通值解析 P
  • Angular 中有主控制器好吗?

    我不知道这是否是一个好的做法 我在路由配置中定义了一个控制器 但是因为我的HomeCtrl is in ng if他听不到的声明loginSuccess所以我做了MainCtrl它监听loginSuccess并做出适当的反应 这段代码工作得
  • 输入类型 = AngularJS 中的数字验证

    我正在尝试验证 lt input type number gt 通过使用输入 数字 AngularJS 模块 ng 的指令 当使用数字类型的输入时 最大 或最小 属性设置为数字 例如

随机推荐

  • 如何将二进制 pgdump(压缩)转换为纯 SQL 文件?

    我确实想在数据库转储中搜索一些数据 但这些转储使用二进制压缩格式 PGDMP标题 如何将它们转换为 SQL 而不恢复它们 pg restore 在没有数据库名称的情况下运行时 将文本转储输出到标准输出 你可以将其发送到其他地方 f或使用 I
  • 如何在 JS 中将 ASCII 艺术图像输入到控制台?

    我正在尝试让这个 ASCII 图像显示在控制台中
  • 将 GridView 导出到多个 Excel 工作表

    我的 Web 应用程序中有两个 Gridview 我需要在单击 ExcelExpot 按钮时将值导出到 Excel 相应的 Sheet1 和 Sheet2 中 protected void ExportToExcel this GridVi
  • “char”关键字的用途是什么?

    是什么charJavaScript 中使用的保留关键字 因为不需要类型声明 特别是使用它的正确语法是什么 有人能给我一个正确的完整示例 吗 因为写char c 抛出一个解释错误说missing before statement 就在之前c
  • 在 C++ 进程之间共享 CGAL 的几何图形

    我正在寻找在进程之间发送 CGAL 几何图形的最快方法 C 假设我们有 2 个进程 A 和 B 进程 A 正在生成几何图形 进程 B 正在显示它 我想以最快的方式连接它们 几何形状为 CGAL 多面体类型 我知道我可以使用共享内存 但是我遇
  • 如何使用ggpmisc的stat_poly_eq在方程中显示不同的y标签

    我正在尝试使用以下命令在绘图上显示方程stat poly eq的函数ggpmisc 我的问题是如何改变y 在等式中 由y1 and y2 通过参考key争论 我尝试添加eq with lhs映射中的参数 但它无法识别该参数 我试图将向量传递
  • WPF 学习曲线有多糟糕? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 轨道形式的单选按钮标签

    我的问题类似于this one https stackoverflow com questions 658689 how to associate labels with radio buttons但对于 Rails 应用程序 我有一个带有
  • 是否可以运行异步调用来在 ASP.NET 中设置会话?

    我有一个页面访问数据库 运行一个繁重的存储过程并返回结果 结果将根据会话变量 Session isShown 显示 我想使用Ajax调用另一个页面来设置 xmlhttp open POST frmCancelWfSearch aspx tr
  • 如何优化SIMD转置函数(8x4 => 4x8)?

    我需要使用 AVX 优化 8x4 和 4x8 浮点矩阵的转置 我用阿格纳 福格的矢量类库 http www agner org optimize vectorclass 青色任务 构建 BVH 并求和最小 最大 每个循环的最后阶段都会使用转
  • 如何在ListActivity中引用OnListItemClick

    我正在开发一个 Android 应用程序 但我遇到了困难ListActivity 我想要有一个不一样的Activity根据单击列表中的哪个项目开始 我列了一个清单并引用它setListAdapter在java中 但我不知道如何在OnList
  • oracle pl/sql DBMS_LOCK 错误

    在Oracle PL SQL中 我想测试睡眠功能 我正在使用 hr 模式 但它给了我错误 PLS 00201 identifier DBMS LOCK must be declared code begin DBMS LOCK Sleep
  • 如何使用 CherryPy 捕获所有异常?

    I use CherryPy http www cherrypy org 运行一个非常简单的网络服务器 它的目的是处理GET参数 如果它们正确 则用它们做一些事情 import cherrypy class MainServer objec
  • Facebook unity SDK,“FB.Init() 已被调用”

    我正在使用 FB Unity SDK 我面临的一个持续问题是检查 FB Init 是否已被调用 设想 有一个 fb 连接按钮 用户单击它 如果用户决定取消对话框并单击 Fb 再次连接 FB sdk 抛出一条通知 指出 FB Init 已被调
  • 如何在一个页面上使用多个 AdSense 单元?

    如何在一个网站上拥有多个 AdSense 单元 Google 提供的唯一代码是按单位计算的
  • 在 CentOS 64 位上安装 ffmpeg “使用 -fPIC 安装”错误

    尝试在 64 位 CentOS 计算机上编译 ffmpeg 时出现此错误 这是我的 configure 选项 configure enable shared enable gpl enable nonfree enable postproc
  • 在C++中读取和写入int到二进制文件

    我不清楚读取长整数是如何工作的 如果我说 long int a 1 666666 ofstream o ex ios binary o write char a sizeof a 将值存储到文件中并希望按原样读回它们 long int st
  • 如何比较 Objective C 中的两个 NSDate 对象

    我有日期类型的对象 我想比较一下 我写了一个if条件 如下所示 if startDate1 isEqualToDate self getDefaultDate startDate1 self getDefaultDate m selecte
  • 面向现有 .NET 开发人员的 Delphi 资源

    任何人都可以为希望获得 Delphi 语言高级概述的 NET 开发人员推荐一些不错的资源吗 我们即将收购一家小型企业 其主要产品是在德尔福开发的 我希望积累足够的知识以便能够与他们交谈 书籍 网站等都很受欢迎 Thanks Delphi基础
  • AngularJS 中使用 Promise 和 Defer 进行同步和异步调用

    我创建了以下控制器 其中有 2 个服务调用服务 第二个响应先于第一个响应 我想做的就像我需要第一个响应 然后第二个响应 但我只是坚持异步和同步请帮我解决 第二次调用取决于第一次调用 例如 如果第一个调用返回 10 条记录 那么我必须调用第二