JavaScript 等待所有异步调用完成

2023-12-05

我需要一些帮助来处理 JavaScript 中的异步调用。我有一个 for 循环,每个循环调用一个异步 HttpRequest,并将其响应添加到一个数组中。我希望程序等到所有异步调用完成后再继续,而不使用 jQuery(仅用于 DOM 操作)。我已经搜索了很多解决方案,但没有一个真正有效,除非大量更改我的代码或依赖 jQuery。

function httpGet(theUrl, callback) {
    var xmlRequest = new XMLHttpRequest();
    xmlRequest.onreadystatechange = function() {
        if (xmlRequest.readyState == 4 && xmlRequest.status == 200) {
            callback(xmlRequest.responseText);
        }
    }
    xmlRequest.open("GET", theUrl, true);
    xmlRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    xmlRequest.setRequestHeader("Accept", "application/json");
    xmlRequest.send(null);
}
$(document).ready(function() {    
    var channels = ["freecodecamp", "storbeck", "terakilobyte", "habathcx","RobotCaleb","thomasballinger","noobs2ninjas","beohoff"];
    var urls = channels.map((x) => "https://api.twitch.tv/kraken/channels/" + x);
    var data = [];
    (function(urls, data) {
        urls.forEach(function(url) {  
            function(resolve, reject) {
                httpGet(url, function(response) {
                    data.push(JSON.parse(response));
                })
            };
        })
    })(urls, data);

    // Continue after all async calls are finished
})

UPDATED:用 Promise 编辑,但仍然不起作用,也许我做错了什么。

function httpGet(theUrl, callback) {
    return new Promise(function(resolve, reject) {
        var xmlRequest = new XMLHttpRequest();
        xmlRequest.onreadystatechange = function() {
            if (xmlRequest.readyState == 4 && xmlRequest.status == 200) {
                callback(xmlRequest.responseText);
            }
        }
        xmlRequest.open("GET", theUrl, true);
        xmlRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        xmlRequest.setRequestHeader("Accept", "application/json");
        xmlRequest.send(null);
    })
}
$(document).ready(function() {    
    var channels = ["freecodecamp", "storbeck", "terakilobyte", "habathcx","RobotCaleb","thomasballinger","noobs2ninjas","beohoff"];
    var urls = channels.map((x) => "https://api.twitch.tv/kraken/channels/" + x);
    var data = [];
    var promises = [];
    (function(urls, data) {
        urls.forEach(function(url) {  
            var promise = httpGet(url, function(response) {
                data.push(JSON.parse(response));
            });
            promises.push(promise);
        })

        Promise.all(promises).then(function() {
            console.log(data);
        })
    })(urls, data);
})

有了承诺,你不应该使用callback范围。致电resolve/reject相反,函数来自于承诺。

不要将回调传递给调用,而是将您想要使用 Promise 的结果执行的操作链接到.then处理程序。

function httpGet(theUrl) {
    return new Promise(function(resolve, reject) {
        var xmlRequest = new XMLHttpRequest();
        xmlRequest.onreadystatechange = function() {
            if (xmlRequest.readyState == 4) {
                if (xmlRequest.status == 200) 
                    resolve(xmlRequest.responseText);
    //              ^^^^^^^
                else
                    reject(new Error(xmlRequest.statusText)); // or something
            }
        }
        xmlRequest.open("GET", theUrl, true);
        xmlRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        xmlRequest.setRequestHeader("Accept", "application/json");
        xmlRequest.send(null);
    });
}
$(document).ready(function() {    
    var channels = ["freecodecamp", "storbeck", "terakilobyte", "habathcx", "RobotCaleb", "thomasballinger", "noobs2ninjas", "beohoff"];
    var urls = channels.map((x) => "https://api.twitch.tv/kraken/channels/" + x);
    var promises = urls.map(function(url) {
//                      ^^^ simpler than forEach+push
        var promise = httpGet(url); // <-- no callback
        return promise.then(JSON.parse);
    });

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

JavaScript 等待所有异步调用完成 的相关文章

  • Angular 2 TypeError:无法读取 null 的属性“animate”

    我正在使用 Chrome 51 和 Angular 2 rc4 并在加载我的 Angular 应用程序时在控制台中弹出以下错误 TypeError Cannot read property animate of null at e supp
  • 克隆表行

    我怎样才能使用javascript 我假设 来克隆一个表格行 就像下图所示的那样 您可以将现场活动连接到所有按钮 例如 如果您给他们一类克隆 则以下内容将起作用 input clone live click function put jqu
  • 用玩笑模拟高阶组件

    我想确保 HOC 组件被开玩笑地调用 但我似乎无法理解jest mock上班 我的 HOC 是这样的 const withEntity args gt const wrappedComponent WrappedComponent gt c
  • 计算两列中两个总和的平均值,并将其显示在 JQGrid 的下一列中

    I m using Jqgrid with summery row at grouping level Now I want to know one thing that Is it possible to show average cal
  • Webpack、Sass - 超出最大调用堆栈大小

    我正在为我的 JS 应用程序使用 Webpack 对于样式 我使用 Sass 我的应用程序非常大 所以我使用了很多 mixins 和 includes 在过去的几天里 虽然应用程序的 SASS 数据增长了一些 我多次遇到相同的以下错误 未捕
  • 如何使用 html 标签包装 window.getSelection().getRangeAt(0) 中的文本选择?

    如何从 window getSelection getRangeAt 0 中进行选择并用 HTML 标签 例如 span 或 mark 包围它 我更喜欢直接的 javascript 或 jQuery 解决方案 我可以使用警报输出选定的文本
  • 使用 mongoDB 插入子文档

    我收集了以下文件 id 2 workspace name 1 widgets name 2 widgets name 3 widgets name 4 widgets 我怎样才能插入 id 1 blabla blabla 在 小部件 中的
  • 防止 Node.js 中的 SQL 注入

    是否有可能以与 PHP 具有防范 SQL 注入的预准备语句相同的方式防止 Node js 中的 SQL 注入 最好使用模块 如果是这样 怎么办 如果不 有哪些例子这可能会绕过我提供的代码 见下文 一些背景 我正在制作一个 Web 应用程序
  • 将值传递给映射函数 - CouchDB

    我想知道是否可以将值传递给 couchDB 设计文档中的映射函数 例如 在下面的代码中 可以传递用户输入的值并使用该值来运行地图函数 也许我可以传递用户UserName当他们登录时 然后根据地图功能显示视图 function doc if
  • 在 Javascript 中隐藏按钮

    在我最新的程序中 有一个按钮 单击时会显示一些输入弹出框 这些框消失后 如何隐藏按钮 You can set its visibility财产 http www w3schools com cssref pr class visibilit
  • `forEach` 函数中的 `return` 关键字是什么意思? [复制]

    这个问题在这里已经有答案了 button click function 1 2 3 4 5 forEach function n if n 3 it should break out here and doesn t alert anyth
  • 如何在 Google 地图上旋转叠加图像?

    我正在尝试将一系列叠加层放置到 Google 地图上 我正在跟随地面覆盖层的示例代码 https developers google com maps documentation javascript examples groundover
  • 发送带有图像的嵌套 JSON

    我一直在尝试研究一种能够通过 Ajax 将嵌套 JSON 请求发送回服务器的方法 根据我的理解 我们主要用于向服务器发送图像或文件的 formdata 在这种情况下不起作用 因为 FormData 似乎不处理嵌套对象 这就是我需要发送的有效
  • JQuery mouseover 函数多次触发

    我很长时间以来一直使用这种方法来为整个类 按钮等 设置事件 div bigButton mouseover function this style backgroundColor dfdfdf 然而 在进行一些测试时 我刚刚注意到 当将鼠标
  • 如何在传单地图上显示热图

    我想在我的传单地图上显示热图 我使用了 heatmap jshttps github com pa7 heatmap js https github com pa7 heatmap js但它最终只是显示 未捕获的类型错误 无法分配给只读属性
  • 尝试将远程图像转换为 Base64 数据时出现 CORS 错误[重复]

    这个问题在这里已经有答案了 我需要将远程图像转换为给定其 URL 的 base64 但我遇到了 CORS 错误 并且不确定如何解决 我遵循了这个问题的一些解决方案 如何使用javascript将图像转换为base64字符串 https st
  • 如何使用javascript将数据存储在xml文件中?

    我是 javascript 新手 并在我的项目中使用它 因为我需要读取 xml 文件 然后在操作后我想将更新后的值存储回 xml 文件中 我成功从 xml 文件获取值 但无法存储值返回到 xml 文件 这是我尝试过的代码
  • 如何从 Instagram 的 media_preview 原始数据重新创建预览?

    如果您从 Instagram 的 API 获取 JSON 数据 您会发现media previewkey 其值是一些 Base64 编码的数据 它看起来确实像一些非常小的预览二进制数据 也许是压缩的 Take 这个帖子 https www
  • 如何使用 JQuery 创建新的 img 标签,并使用 JavaScript 对象中的 src 和 id?

    我从基本意义上了解 JQuery 但对它绝对是新手 并且怀疑这很容易 我在 JSON 响应中获得了图像 src 和 id 转换为对象 因此在 responseObject imgurl 和 responseObject imgid 中获得了
  • 如何拦截javascript中innerHTML的变化?

    我需要拦截网页内单元格内容的任何更改 以下代码显示 addEventListener 不起作用 function modifyText alert var el document getElementById mycell el inner

随机推荐

  • MySQL处于“正在发送数据”状态是什么意思?

    如果 Mysql 查询 SHOW PROCESSLIST 在 状态 列中返回 正在发送数据 我想这意味着查询已经执行并且MySQL正在向客户端发送 结果 数据 但我想知道为什么它花费了这么多时间 最多一个小时 谢谢 这是一个相当具有误导性的
  • 下面的代码中实习生是如何工作的?

    String a abc String b a substring 1 b intern String c bc System out println b c 这个问题可能很愚蠢 因为实习生在这里没有主要用途 但我仍然对这个事实感到困惑 为
  • 在android中通过Loaders插入记录

    这个问题将是被问者的后续问题内容解析器与游标加载器答案清楚地说明了如何使用 Content Resolver 将记录插入到 sqlite Db 中 我的问题如下 我可以使用加载器 普通加载器 来实现此功能吗 eg public Loader
  • 使用java将HTML转换为图像

    我在使用 java 将 html 转换为图像时遇到一些问题 我正在使用 html2image java 它创建一个图像 但问题是它只在 html 的一小部分上创建图像 我怎样才能制作整个 html 的图像 谢谢 这是我的代码 import
  • 如何使用 Nokogiri 用

    标签包装 HTML 无标签文本?

    我必须将 HTML 文档解析为不同的新文件 问题是有一些文本节点没有被包裹起来 p 标签 而不是他们有 br 每个段落末尾的标签 我想用以下文字换行 p p 使用 Nokogiri 的标签 p div b Footnote 15 b Cat
  • 在Python中复制多个文件

    如何使用 Python 将一个目录中存在的所有文件复制到另一个目录 我有源路径和目标路径作为字符串 您可以使用os listdir 获取源目录中的文件 os path isfile 查看它们是否是常规文件 包括 nix 系统上的符号链接 以
  • 如何递归替换对象中的键名称?

    我试图弄清楚如何使用递归将对象的键名称替换为新的键名称 这也包括嵌套对象内部的键名称 我觉得这与我在第一个 if 条件语句中重新分配给 newObj 的方式有关 有什么建议么 到目前为止 这是我的代码 24 Find all keys in
  • azure 搜索按分数排序和过滤

    我想知道如何使用 azure 搜索按分数过滤和排序结果 我试过 https domaine net indexes indexName email protected 20desc count true Return object stdC
  • 如何在网页中的特定 div 中垂直向下滚动

    我搜索了所有论坛 但没有得到我的问题的正确答案 我要测试的网页下面隐藏了一个链接 我尝试通过使用 xpath 或元素的 ID 属性搜索它来手动找到它 但在运行 Web 驱动程序脚本时找不到它 即使它没有在该元素上给出任何错误 我也会在下一个
  • 如何“git show”合并提交的差异?

    当我进行合并提交并运行时git show
  • FFmpeg:从 RTSP 读取时如何控制控制台输出?

    所以我创建了简单的Consol应用程序 FFmpeg RTSP视频流阅读器 仅使用通用FFmpeg C API 但是当ffmpeg从RTSP读取时它会显示大量信息 我没有询问是否 至少不是全部 那么我如何过滤 ffmpeg 输出的内容 我的
  • 如何在 Windows PE 32 位可执行文件中为我的代码洞腾出空间

    所以我想在minesweeper exe 典型的Windows XP扫雷游戏 链接 扫雷舰 所以我通过CFF Explorer修改了文件的PE头以增加文件的大小 text部分 我尝试增加原始大小 text分段1000h 新大小为3B58 但
  • 如何将此 SQL 查询转换为 EF Core 中的 LINQ 查询?

    我有下表 Indicators A INT B INT C INT D INT TimeInsertedLocal DateTime 我有映射到该表的 EF Core 映射实体 我需要将此 SQL 查询转换为 ef core Linq 等效
  • Matplotlib 图/图/画布/布局隐藏按钮

    Matplotlib 图 图 画布 布局隐藏按钮 图片应该可以解释问题 我希望绘图的容器为右侧的按钮留出空间 这是一个最小的工作代码示例 其中包含我尝试过的一些注释 import sys from PyQt5 QtWidgets impor
  • Python 3:如果 URL 没有“//”,则“urllib.parse”中的“netloc”值为空

    我注意到netloc如果 URL 没有则为空 Without netloc是空的 gt gt gt from urllib parse import urlparse gt gt gt urlparse google com ParseRe
  • 与访问 malloc 内存(未初始化)感到困惑

    声明简单结构 struct s char addr s ips 现在分配该结构数组内存 num 5 ips r malloc num sizeof r 我知道 malloc 只是分配内存 并且不初始化 可能存在垃圾值 现在我想知道如果我不初
  • 为什么 Valgrind 不喜欢我对 glutCreateWindow 的使用?

    我正在使用以下代码 169 const char title Title c str 170 glutCreateWindow title Valgrind 给了我以下内容 28841 Conditional jump or move de
  • 无法在 Glade GTK+3 中连接信号和信号处理程序

    大家好 我正在 Ubuntu 14 04 LTS 上的 GTK 3 中开发一个项目 我正在尝试使用 Glade 但是当我尝试将切换按钮的 切换 信号连接到名为 kaczka 的函数时 编译后我在控制台中得到了这个 Gra w Statki
  • 如何覆盖 Android WebView 以使用自定义 Accept-Language 标头?

    是否可以覆盖 Android WebView 以使用自定义 Accept Language 标头 目前的实施WebView已经允许您使用以下语法添加标头 Map
  • JavaScript 等待所有异步调用完成

    我需要一些帮助来处理 JavaScript 中的异步调用 我有一个 for 循环 每个循环调用一个异步 HttpRequest 并将其响应添加到一个数组中 我希望程序等到所有异步调用完成后再继续 而不使用 jQuery 仅用于 DOM 操作