角度 $q,如何在 for 循环内和之后链接多个 Promise

2023-11-21

我想要一个 for 循环,每次迭代都会调用异步函数。

在 for 循环之后,我想执行另一个代码块,但不是在 for 循环中的所有先前调用都已解决之前执行。

我目前的问题是,要么在所有异步调用完成之前执行 for 循环之后的代码块,要么根本不执行它。

带有 FOR 循环的代码部分及其后面的代码块(完整代码请参见fiddle):

[..]
function outerFunction($q, $scope) {
    var defer = $q.defer();    
    readSome($q,$scope).then(function() {
        var promise = writeSome($q, $scope.testArray[0])
        for (var i=1; i < $scope.testArray.length; i++) {
             promise = promise.then(
                 angular.bind(null, writeSome, $q, $scope.testArray[i])
             );                                  
        } 
        // this must not be called before all calls in for-loop have finished
        promise = promise.then(function() {
            return writeSome($q, "finish").then(function() {
                console.log("resolve");
                // resolving here after everything has been done, yey!
                defer.resolve();
            });   
        });        
    });   

    return defer.promise;
}

我创建了一个 jsFiddle ,可以在这里找到http://jsfiddle.net/riemersebastian/B43u6/3/.

目前看来执行顺序很好(请参阅控制台输出)。

我的猜测是,这只是因为每个函数调用都会立即返回而不做任何实际工作。我尝试用 setTimeout 延迟 defer.resolve 但失败了(即最后一个代码块从未执行)。您可以在小提琴的注释块中看到它。

当我使用写入文件和从文件读取的实际函数时,最后一个代码块在最后一个写入操作完成之前执行,这不是我想要的。

当然,错误可能出在这些读/写函数之一中,但我想验证我在此处发布的代码是否有任何问题。


你需要使用的是$q.all它将多个 Promise 合并为一个,只有当所有 Promise 都得到解决后,该 Promise 才会得到解决。

在你的情况下,你可以这样做:

function outerFunction() {

    var defer = $q.defer();
    var promises = [];

    function lastTask(){
        writeSome('finish').then( function(){
            defer.resolve();
        });
    }

    angular.forEach( $scope.testArray, function(value){
        promises.push(writeSome(value));
    });

    $q.all(promises).then(lastTask);

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

角度 $q,如何在 for 循环内和之后链接多个 Promise 的相关文章

  • 无头镀铬:镀铬无法到达

    我正在使用 Chrome headless 来运行量角器测试 它运行了一段时间 但之后我收到以下错误 15 36 30 E 启动器 chrome 无法访问 会话信息 无头 chrome 59 0 3071 115 驱动程序信息 chrome
  • 如何在 AngularJs 中的指令内修改范围

    我需要从指令内的回调中修改根范围属性 但该指令位于由 switch 指令创建的内部作用域中 HTML div p Selected selected p div div p Item selected p div div div
  • Angular - 我可以从 Angular 应用程序外部广播消息吗?

    我有一个场景 我需要非角度代码 在本例中是 Facebook 和 Twitter JS sdk 来广播角度控制器可以侦听的事件 为什么 初始页面加载后 我通过 AJAX 加载并修改页面中的内容 内容附有多个点赞 推文按钮 如博客 聚合器的首
  • AngularJS - 为什么使用“控制器作为虚拟机”?

    整个周末 我都很苦恼 不明白为什么子控制器无法识别父控制器的功能 我很快意识到将我的控制器作为虚拟机是原因 div div div div div div 当然 现在看来很明显 child1 和 2 都不会看到 ParentCtrl 中的函
  • Node.js 将 async/await 与 mysql 一起使用

    我一直在尝试在节点中将 async await 与 MySQL 一起使用 但它每次都会返回一个未定义的值 有理由吗 请在下面找到我的代码 const mysql require promise mysql var connection co
  • 将表类型添加到 JSON 编辑器

    我想了解的代码这个 JSON 编辑器 http mb21 github io JSONedit 并修改它 In 指令 js https github com mb21 JSONedit blob gh pages js directives
  • AngularJS 与(Angular JS + jQuery)

    我有一个关于仅使用 AngularJS 和纯 JavaScript 以及使用 AngularJS 和 jQuery 时的性能问题 ex app directive fitHeight function window return restr
  • Cordova 文件传输到节点服务器

    我正在使用 ng Cordova fileTransfer 插件尝试将用户相机胶卷中的照片上传到 Node Express 服务器 我正在获取照片的本地 URI 并尝试将其传递给插件 如下所示 cordovaFileTransfer upl
  • 如何使用 Vert.x 2.x 启用 CORS

    我正在尝试使用 Angularjs 1 4 5 发出跨域请求 但无法获得成功 我已经配置了 httpprovider config httpProvider function httpProvider httpProvider defaul
  • AngularJS 服务返回未定义

    我有以下服务 app services emailService http sce function http sce return getMessage function messageId callback http get api e
  • 角度斜线被编码

    我和这个人有同样的问题 angularjs slash after hashbang gets encoded https stackoverflow com questions 17530924 angularjs slash after
  • 容器中的等间距 div

    这是我的例子 http jsfiddle net rtCP3 62 http jsfiddle net rtCP3 62 我有 3 个 或更多 div 我想在一个容器中均匀分布 当将 Angular 与 ng repeat 一起使用时 样式
  • 通过 Angular 4 进行的 Bootstrap 4 轮播的动态填充不显示图像

    我试图通过 ngFor 迭代包含图像 url 的字符串数组来动态填充 Bootstrap 4 轮播 轮播不显示图像 尽管查看生成的标记一切看起来都很好 我猜测该组件是在 Angular 添加每张幻灯片的 div 之前渲染的 因为 轮播幻灯片
  • 比较 angularjs 指令中的两个字段

    我正在尝试创建可用于比较多个项目中的两个字段的指令 MarkUp div class form group div
  • 拖放以在 angularjs 中排列表格行顺序

    我正在使用 angularjs 并有一个简单的表格 我使用下面的代码 table tr th Name th th Phone th tr tr td friendObj name td td friendObj phone td tr t
  • 如何处理 Protractor 中的模态对话框?

    我正在尝试使用sendKeys 在模态对话框上this http www gifteng com login网站 单击后出现此对话框Sign In按钮 我似乎找不到任何方法将焦点切换到盒子上 请参阅gist https gist githu
  • 使用 Jasmine 测试 Angular 异步服务

    我正在尝试使用 Jasmine 测试真正的 http 调用 集成测试 但是当我调用使用 http get 的方法时 它会超时并且服务器永远不会被调用 我知道我应该注入 http 的实现 但不确定应该在哪里发生 搜索服务 app servic
  • 在没有全局变量的情况下对多个事件使用 Promise 回调

    我有一个包含在函数中的承诺 我将使用不同的输入参数多次调用该函数 每次承诺解决时 我都会将解决的值推送到存储数组中 当我所有的调用承诺都得到解决后 我将在其他函数中使用这个存储数组 是否有任何干净的方法可以在不使用 全局 变量的情况下进行设
  • $state.go 不适用于嵌套状态

    下面描述的我的问题与此处描述为错误的问题类似 https forum ionicframework com t blocker bug with state go navigation 11036 https forum ionicfram
  • angular-cli:Karma-Webpack 因“没有此类文件或目录”而失败

    我从Tour of Heroes使用标准 Angular systemjs 现在我正在使用angular client它在开发 生产模式下运行顺利 但我无法测试任何东西ng test 以下内容会被吐出 不仅适用于test ts但也为了pol

随机推荐

  • 正则表达式删除多行注释

    我正在尝试使用这个正则表达式 JS g 取代 sdandsads 什么也没有 但它不起作用 为什么 o O 点捕获除换行符之外的所有内容 如果 dotall 为 false 所以要么使用 dotall 正如其他答案 评论中提到的 这在 ja
  • Android:折叠线性布局而不是折叠工具栏

    我正在尝试在单个片段中创建主 详细信息事务 我考虑使用 LinearLayout 作为标题的编辑文本的容器 然后是 RecyclerView 了解详细信息 如何实现类似于 CollapsingToolbar 效果的 LinearLayout
  • Kibana 报告字段存在冲突,我该如何解决?

    在 Kibana 中 我注意到在刷新索引模式后 我的一个字段显示为conflicted Example 所以我知道这是因为 Elastic Search 在该字段中发现了不同类型的值 我如何确定这一点 它导致我的视 觉效果破坏 因为它们无法
  • C# 两组排序数字最快的交集

    我正在应用程序的时间关键部分计算两组排序数字的交集 这个计算是整个应用程序的最大瓶颈 所以我需要加快它的速度 我已经尝试了很多简单的选项 目前正在使用这个 foreach var index in firstSet if secondSet
  • 如何理解 Yahoo! 的原始 HTML使用Python检索数据时的财务?

    我一直在尝试从 Yahoo 检索股票价格 金融 比如苹果公司 我的代码是这样的 使用Python 2 import requests from bs4 import BeautifulSoup as bs html http finance
  • 获取不带 Content-Disposition 的文件名

    我几天来一直在寻找这个问题的解决方案 但找不到任何解决方案 我想使用网络客户端从网络服务器下载文件 下载工作正常 但我无法获得真实的文件名 这对我来说非常重要 我在很多主页上看到 文件名应该保存在 Content Disposition H
  • Android 不使用 XML 指定像素单位(如 sp、px、dp)

    是否可以在代码中指定像素单位 我的意思是 假设我有一个布局 并且我希望大小为 20dp 那么有什么方法可以在不编写布局 xml 的情况下做到这一点 在一个视图中 DisplayMetrics metrics getContext getRe
  • 全屏视频无黑边

    我遇到的问题是 视频总是在侧面或顶部 底部出现黑条 具体取决于屏幕尺寸 知道如何让它始终全屏显示而不显示恼人的黑条吗 并且不使用插件 这是我的标记 div div class box iframe box width 1280 height
  • 使用 java 在 Selenium WebDriver 中垂直向下滚动和向上滚动

    有人可以帮我自动化吗向下滚动功能 with 网络驱动程序 using Java 就我而言 对于雅虎邮件 Sign In 正在显示 visible 一旦我垂直向下滚动鼠标 滚动到页面的某个元素 JavascriptExecutor drive
  • 通过替换求解递推式 T(n) = 2T(n/2) + θ(1)

    所以我很确定它是 O n 但也可能不是 但是如何通过替换来解决它 如果假设 T n 首先 我想清楚地假设 1 k 某个常数 接下来 继续使用替换法 我们得到 T n 2T n 2 1 2T n 2 k 2 2T n 4 k k 4T n 4
  • selenium.common.exceptions.SessionNotCreatedException:消息:无法通过 Selenium 找到与 Firefox 46 匹配的功能集

    我这里肯定有一些版本不匹配 因为我无法使用 Python 来启动 Selenium 来启动 Firefox Web 浏览器 我使用旧版本的 Firefox 因为这里的其他人都使用相同的旧版本 Python 并且对他们来说旧版本的 Firef
  • 什么是函数 __tcf_0? (使用gprof和g++时看到)

    我们使用 g 4 2 4 我试图找出代码中的一些性能问题 我正在运行 gprof 来生成配置文件 并且我得到以下 奇怪的信息 因为最昂贵的函数是 tcf 0 Each sample counts as 0 01 seconds cumula
  • 如何从 std::ifstream 将文件读入 unsigned char 数组?

    所以通常我会做这样的事情 std ifstream stream int buff length 8192 boost shared array
  • 从 json 对象创建一个强类型的 C# 对象,ID 作为名称

    我正在尝试使用一家知名在线会议提供商的 API 他们的 API 调用之一返回一个如下所示的对象 5234592 pollsAndSurveys questionsAsked 1 surveyCount 0 percentageSurveys
  • 是否可以在 lambda 闭包中隐藏变量?

    我正在尝试在 Kotlin 中创建一个类型安全的 Groovy 风格构建器 就像它所描述的那样here 问题是嵌套 lambda 中 lambda 接收器的可见性 这是一个简单的例子 html head id head1 body head
  • 如何计算 numpy 中所有向量差对?

    我知道我能做到np subtract outer x x If x有形状 n 然后我最终得到一个形状为的数组 n n 然而 我有一个x有形状 n 3 我想输出一些有形状的东西 n n 3 我该怎么做呢 或许np einsum 您可以使用br
  • 将函数应用于所有成对列组合的最快方法

    给定具有任意行数和列数的数据框或矩阵 将函数应用于所有成对列组合的最快方法是什么 例如 如果我有一个数据表 N lt 3 K lt 3 data lt data table id seq N for k in seq K data k lt
  • Sublime Text 2 新文件的默认文件类型

    我环顾四周 问题和答案似乎与我要寻找的不符 每当我打开新文件时 它都会默认为计划文本文件 我主要使用 HTML 文件 所以我想知道是否有一个设置可以更改 以便当我打开新文件时它会默认为 HTML 希望这是可能的 Rob 创建一个新插件Too
  • 数字签名后托管 Windows 服务启动缓慢

    我们最近尝试对 NET 二进制文件进行数字签名 我们有一个 Windows 服务 通常会在 10 秒内启动 然而 当我们开始对其进行数字签名后 时间增加到大约 20 30 秒 谷歌搜索给我带来了这个 http support microso
  • 角度 $q,如何在 for 循环内和之后链接多个 Promise

    我想要一个 for 循环 每次迭代都会调用异步函数 在 for 循环之后 我想执行另一个代码块 但不是在 for 循环中的所有先前调用都已解决之前执行 我目前的问题是 要么在所有异步调用完成之前执行 for 循环之后的代码块 要么根本不执行