等待多个延迟对象完成并使用解析值

2024-05-06

我正在尝试找出一种方法来等待多个延迟对象并在完成后处理它们,可能就像开始延迟对象的下一组。

我被困住了,因为以下结果不是预期的结果。 我期待结果为

allDone resovled values are 1,2,3

实际结果是

allDone resovled values are 1,2
var dfd1 = new $.Deferred();
var dfd2 = new $.Deferred();
var dfd3 = new $.Deferred(); 
var dfds = [ dfd1, dfd2, dfd3 ]; 
var resolvedValues = [];

$.when.apply($, dfds).done(function() {     
    dfds.forEach(function(dfd){
        console.log("inloop");      
        dfd.promise().done(function(value) {
            resolvedValues.push(value);         
        });     
    });
    console.log("allDone resovled values are" + resolvedValues);
})

dfd1.resolve(1);
dfd2.resolve(2);
dfd3.resolve(3);

For the why, 见下文。但你把它弄得太复杂了。 :-) 您给出的最终承诺的回调when为您提供解析值作为参数:

$.when.apply($, dfds).done(function(a, b, c) {
    // Here, a is 1, b is 2, c is 3
    // Or you can access them on `arguments`
})

实例:

var dfd1 = new $.Deferred();
var dfd2 = new $.Deferred();
var dfd3 = new $.Deferred(); 
var dfds = [ dfd1, dfd2, dfd3 ]; 
var resolvedValues = [];

$.when.apply($, dfds).done(function() {
    // Use a trick to turn `arguments` into a real array
    var a = Array.prototype.slice.call(arguments);
    // Show what we got
    console.log("allDone: " + a.join(", "));
})

dfd1.resolve(1);
dfd2.resolve(2);
dfd3.resolve(3);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

旁注:我假设您正在故意处理数组。如果您有固定数量的承诺需要等待,只需使用更简单的形式

$.when(dfd1, dfd2, dfd3).then(function(a, b, c) {
    // ...
});

Here's why你得到了非常奇怪的结果:jQuery'sDeferred/Promise对象有一个问题,因为它们是chaotic: 你打电话时done在他们身上,你不知道你的回调是否会被执行同步地 or 异步地。这是一个严重的缺陷,也是真正的 Promises/A+ 实现所不具备的缺陷(回调始终是异步的)。

jQuery 将调用回调异步地如果承诺尚未兑现。但它会调用它同步地 if it isn't解决:

var d1 = $.Deferred();
d1.done(function() {
    console.log("I'm called asynchronously");
});
d1.resolve();

var d2 = $.Deferred();
d2.resolve();
d2.done(function() {
    console.log("I'm called synchronously");
});

所以你的代码中发生的事情是总体done回调那个when火被点燃during the done最后一个已解决的承诺的回调(dfd3)。由于承诺没有标记为已解决,直到after the done回调已经完成,当你的代码运行时,dfd1 and dfd2已解决但是dfd3目前仍在解决过程中。所以你的内部回调被同步调用dfd1 and dfd2 but 异步地 for dfd3。所以你在之前输出你的结果dfd3返回值已被推送到您的数组中。

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

等待多个延迟对象完成并使用解析值 的相关文章

随机推荐

  • UIView 动画选项重复计数

    我的 Swift 代码遇到一些问题 我试图使 UIImageView 对象消失并重新出现一次 但在让动画仅播放一次方面遇到一些问题 IBOutlet weak var ball UIImageView IBAction func onFad
  • 复制构造函数和移动构造函数的效率差异

    C 11引入了右值引用的新概念 我在某处读到它并发现以下内容 class Base public Base Default Ctor Base int t Parameterized Ctor Base const Base b Copy
  • JQUERY MOBILE 文本输入中的自动完成

    我在网上搜索了很多但找不到任何解决方案 我正在制作一个网络应用程序 其中我想要 2 个文本框来获取用户的数据输入 我想要此文本框中的自动完成功能 自动完成的标签列表在本地可用 我尝试了listview 但我想要的是 在用户从自动完成提示中选
  • C# - 检索 COM+ 组件的属性?

    我的服务器 Windows Server 2003 上有一个 COM 组件 有什么方法可以以编程方式检索该组件的属性 例如使用的构造函数字符串 当我转到管理工具 gt 组件服务 gt COM 应用程序并右键单击我的组件时 这些是我希望能够检
  • 如何在使用应用程序的用户之间获得 Facebook 相互点赞

    假设两个用户正在使用一个应用程序 并已授予该应用程序适当的权限来检索他们的喜好 是否可以使用 FQL 或图形 API 来查找它们的共同点 类似于如何使用图形 API 查找两个用户之间的共同好友 我认为在我浏览文档时不存在这样的 api 调用
  • 手电筒打开时 Android 相机的奇怪行为

    我有以下 android 代码 这里用伪代码编写 mCamera configAndInitialize all I want to do before taking picture mCamera startPreview mCamera
  • SQL 层次结构 - 解析给定节点的所有祖先的完整路径

    我有一个由邻接列表描述的层次结构 不一定有单个根元素 但我确实有数据来识别层次结构中的叶 终端 项 所以 一个看起来像这样的层次结构 1 2 4 7 3 5 6 8 9 将通过表格来描述 就像这样 NOTE 我没有能力改变这种格式 id p
  • 无法打开“storage/logs/laravel-2019-11-22.log”:无法打开流:权限被拒绝

    在生产服务器上输入我的网站时出现以下错误 无法打开流或文件 var app current storage logs laravel 2019 11 22 log 无法打开流 权限被拒绝 我尝试运行以下命令 但 git 权限在终端中被拒绝
  • 所选设备不兼容 - Android Studio

    我之前已经解决了这个问题 但现在不能 我需要永久修复 在测试我的应用程序时 Android Studio 中的一切都很顺利 我现在遇到了 所选设备不兼容 的问题 当我去运行应用程序时 我想知道如何阻止它读取我手机的 API 作为 1 而不是
  • 使用媒体查询将 CSS 应用于除 IE 之外的所有浏览器

    我找到了一种将媒体查询应用于 IE 的方法 media ms high contrast none ms high contrast active 有没有办法将 CSS 应用于除 IE 之外的所有浏览器 就像是 media not ms h
  • asp.net 内联代码 <%# MyboolVal %>

    我一定在这里错过了一些愚蠢的东西 但我看不到它 我的工作在他们的网站上使用内联代码 例如
  • 从光栅计算器传输到 R 的条件命令

    到目前为止 我在ArcGIS的栅格计算器中使用了以下语句 Con Land use rst 20 Export rst 这会计算一个新栅格 其中仅包含来自导出的数据 其中 Land use 等于 20 这正是我想要的 但我想自动化这个R 因
  • Docker:Nginx 和 php5-fpm docker 不说话

    我想进行完全 Docker 化的 Drupal 安装 我的第一步是让容器与 Nginx 和 php5 fpm 一起运行 两者都基于 Debian 我在 CoreOS alpha 频道 使用 Digital Ocean 我的 Dockerfi
  • 如何让Register-ObjectEvent在后台运行?

    我有一个使用 PowerShell 的脚本Register ObjectEvent观察文件夹的更改 由于 Register ObjectEvent 仅在 PowerShell 会话处于活动状态时才起作用 因此我需要保持 PowerShell
  • C# 中的监视器与互斥体[重复]

    这个问题在这里已经有答案了 可能的重复 C 中各种线程同步选项之间有什么区别 https stackoverflow com questions 301160 what are the differences between various
  • CSS 中的垂直线(与
    相对)

    我知道它不存在 但是有纯CSS版本吗 想要设置高度 并将其设置为 1px 宽 如果可能的话 带有阴影 只是无法理解纯 CSS 的方式来做到这一点 需要绝对定位 因为我的容器有两个并排的 div 例如 60 40 的分割 需要两者之间的垂直规
  • 在 Kivy 应用程序中获取文本输入值

    Python Kivy 新手尝试构建一个测试应用程序 其中包含输入框 确定按钮和单击确定按钮时应更改文本的标签 但我得到了 NameError 全局名称 txt1 未定义 我究竟做错了什么 import Kivy import kivy i
  • 无法从同一项目的 bin 目录导入模块

    我正在构建一个库 该库将通过 pip 包含在其他项目中 我有以下目录 venv 是 virtualenv project bin run py myproj init py logger py venv 我激活虚拟环境 在 bin run
  • 减法进位标志

    我正在使用 MASM32 有了这个代码 mov eax 5 sub eax 10 CF 状态标志将被设置 但使用我的铅笔和纸 我实际上看到 MSB 没有任何进位 是的 我知道从较少的数字中减去大的数字集CF 但我想知道为什么 因为使用这段代
  • 等待多个延迟对象完成并使用解析值

    我正在尝试找出一种方法来等待多个延迟对象并在完成后处理它们 可能就像开始延迟对象的下一组 我被困住了 因为以下结果不是预期的结果 我期待结果为 allDone resovled values are 1 2 3 实际结果是 allDone