问题标签 [asynchronous-javascript]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
javascript - 异步函数的调用者应该是异步的吗?
async
当被调用函数 (CE) 使用关键字声明并且是异步函数时,调用者函数 (CR) 是否应该使用关键字声明并因此是async
异步函数?假设除了调用 CE 之外,CR 没有执行其他异步任务,但 CR 有一些逻辑取决于从 CE 接收到的响应。
例如,我有一个apiUtils.js
文件,其中包含一个用于进行 API 调用的通用异步函数。此函数具有以下签名:
我还有其他文件可以导入apiUtils.js
文件来发送特定的 API 请求。例如,有一个userApi.js
文件可以导入apiUtils.js
并具有一个函数,该函数doLogin()
具有以下签名:
该doLogin()
函数是否应该使用async
关键字声明并因此是一个异步函数?如果是,调用堆栈中的所有调用者都应该用async
关键字声明,因此是异步函数(假设另一个函数 F 调用doLogin()
函数)?为什么会这样?
PS:请忽略仅根据关键字在函数体内使用或使用 / 块的事实来async
确定函数关键字的使用。关键字仅用于演示目的。你也可以假设链式的承诺。doLogin()
await
try
catch
async/await
javascript - 为什么这不异步运行(因为里面有 Promise)?
我是 javascript 的新手,我一直在学习 Promise,最近我开始研究一些简单的列表,该列表以随机延迟 (setTimeout) 检索,我认为这是一个经典的。在尝试并进行了一些研究之后,我发现我发布的帖子对我有很大帮助,而且效果很好,但是在查看了该帖子对我所做的建议之后,我注意到差异是两个括号......我一直在阅读和试图理解为什么括号会产生如此大的差异(两个选项都有效),但我不明白。
有人可以解释有什么区别吗?我提到的括号在函数 loadIng() 中,第 5 行和第 12 行,第一行的左括号和第二行的右括号。
如果我用方括号运行代码,它会同步运行,但如果我在没有方括号的情况下运行它,它会异步运行......我真的不明白。
reactjs - 无法访问 React useEffect 中数组的方法和属性
我在我的项目中使用 Firebase、React、Redux,我想使用 useEffect() 将数据从 firebase 发送到 redux 的全局存储。我面临的问题是我无法访问数组的方法和属性,即使我可以使用console.log(array)
它来获取它的元素。
让我简要解释一下我的代码:
images
我将从数据库中获得的每一组分配给各自的组,product
然后将其发送到 redux 全局存储。
我的火力基地结构:
products
是根集合,images
是products
在我的 useEffect() 中,我定义了 3 个函数,即extractImagesFromDatabase
、getOtherDataAndSendGlobalStore
和SendDataToGlobalStore
。我使用 2 个函数从数据库中检索数据的原因是extractImagesFromDatabase
仅仅从集合中获取数据,products/productsId/images
但从集合中getOtherDataAndSendGlobalStore
获取数据products
。
顾名思义,
extractImagesFromDatabase
就是从数据库中获取图像,从数据库
getOtherDataAndSendGlobalStore
中获取其他数据,
SendDataToGlobalStore
是调用上述两个函数的函数。
使用函数获取“图像”后extractImagesFromDatabase
,我将它们推送到数组“图像”,稍后我想在getOtherDataAndSendGlobalStore
函数中使用它。
在使用 . 从数据库中获取我想要的所有数据后getOtherDataAndSendGlobalStore
,我使用一个名为setProducts
.
问题是我不能对我在顶部定义的“images”数组使用“forEach”、“map”甚至“length”。但是,当我console.log(images)
用来检查它是否为空时,里面有 2 个元素。
我已经陷入这个问题好几天了。如果有人能指出我的错误,将不胜感激。
javascript - Angular - 事件发生后重新触发事件 event.preventDefault()
我在我的应用程序中使用Angular 12
withPrimeNG
来实现一个custom confirm()
功能。用例如下:
当用户点击表单上的任何复选框或单选按钮时,在事件触发之前,应显示一条确认消息,询问用户是否真的想要继续。
为了实现这一点,我event.preventDefault();
首先使用阻止选择,然后如果用户在自定义确认消息上单击“是”,我想重新触发刚刚阻止的事件。下面的代码示例:
onCheckboxChange
打开确认对话框
}
对于这个用例,我是否走在“正确的道路”上?我知道我可以专门为每种情况设置检查的值(如果它是复选框),例如:
或者相应地,如果它是一个单选按钮,但我想以“通用方式”实现它,有什么想法吗?
提前致谢!
javascript - 当用户单击按钮时,使用多个 api 调用(本地后端)动态更新 Mapbox 中的图层数据 - React js
我正在尝试在 React 应用程序(不使用包装器)中使用 Mapbox GL JS 将 geojson 数据呈现为一个层,当用户单击按钮时数据会更新。看来我只能在“组件确实安装”useEffect 中使用 .on load 事件侦听器创建图层,并且我只能在此 .on 加载代码块的范围内向图层添加数据。每当用户单击按钮时,如何更新 Mapbox 图层数据的源,通过对本地后端的 API 调用获取新数据并在地图上呈现?
我曾尝试在文档和在线搜索此信息,但似乎只能找到“组件确实安装”上可用数据的示例,而不是通过 API 动态更新的示例。
谢谢你的帮助。
请参见下面的代码:
javascript - 在 JS 中以 *blocking* 方式使用 YouTube API
对于我正在做的一个副项目,并且为了学习更多的 JS,我正在玩 YouTube API 示例,试图了解它们是如何工作的。
在 Google 自己的用于获取给定 YT 频道的播放列表的文档中,我们有以下异步代码:
就我而言,我想了解如何将其转换为同步请求,这意味着我希望线程被阻塞,直到响应尚未到达。
我怎样才能做到这一点?
我看到你可以把上面的函数分解成这两个部分:
然而这并没有帮助,因为现在它是以非阻塞方式工作的 execute() 方法。
我也有点怀疑我正在尝试做的事情是否可能,因为 YouTube API 本来可以通过设计以非阻塞方式编写,所以这可能是使用它的唯一方法......但是这只是我的自由猜测。
最后我知道这与人们通常问的相反(如何使你的代码非阻塞)但有时这就是我学习东西的方式...... :)
javascript - 为什么我收到错误:405:JavaScript 和 PHP 中的异步通信中不允许的方法
我开始学习 JS 异步通信及其工作原理,并尝试构建一个简单的示例(遵循 Robin Nixon 的“Learning PHP, MySQL & JavaScript”一书)。
我有一个 HTML 文件,其中包含一些 JS (urlpost.html) 和另一个 PHP 文件 (urlpost.php),用于与 HTML 文件进行异步交互。我要做的是首先,HTML 文件<H1>
在<div id="info
. 在异步通信的readyState属性为4(已完成)和状态为200之后,我想<div id="info">
用服务器返回的文本更改里面的句子。
我得到的错误是错误:405 Method Not Allowed
我不确定自己做错了什么,是因为我在代码上做错了什么,还是因为我作为参数传递的 URL 不允许这种通信。我已经花了一些时间试图弄清楚我做错了什么,但在这一点上,我不确定还能做什么。
urlpost.html
urlpost.php:
javascript - 在 JS 中执行完另一个异步函数后,如何执行异步函数?
我正在尝试使用 vanilla JS 和 API 创建一个天气报告应用程序。我的目标是:
- 当网页完成加载时,我想询问用户他们的位置。
- 如果用户接受请求 我想使用浏览器 api 获取他们的坐标并存储纬度和经度,然后运行另一个异步函数,该函数将使用这些纬度和经度数据从 OpenWeather api 获取数据。湾。相应地更新 UI。
- 如果用户阻止请求:我仍想从 OpenWeather api 获取数据,但这次使用默认的纬度和经度值(例如巴黎)
我面临的问题是:
- 我正在尝试使用承诺功能获取地理位置。因此,如果使用 async/await,这将在异步函数中执行,但我无法一个接一个地运行两个异步函数,以便它可以使用先前执行的函数的响应数据。
- 如果用户在浏览器中阻止该位置,该函数将被拒绝并执行catch块,那么我应该将天气api函数放在catch块中以使用默认的经纬度值还是做其他事情?
- 据我所知,连续执行多个异步函数并不能保证结果将以相同的顺序出现,因此有时天气 api 函数会使用默认的 lat 和 lon 值成功地从 api 获取数据,而不是等待用户的位置。如何修复代码以便获得所需的输出?
我是 JS 和 SO 的新手,所以如果需要任何澄清,请告诉我。顺便说一句,我还分享了代码以便更好地理解。抱歉发了这么长的帖子:(
javascript - 如何在 js 映射函数(Node Js)中停止异步调用
我有这个 updateGameScore 异步服务功能,如果 GameScore 集合中没有具有特定用户 ID 的记录,则用于添加新记录,或者如果存在则更新相关记录:
然后我在 map 函数中调用这个函数,从已经存在的 db 集合中调用 50,000 次。
但是,我的代码 updateGameScore 函数可以正常工作(如果我一一调用)。但是当我一次调用 50,000 条记录时,所有记录都会并行调用此函数,并在我的 GameScore 集合中创建 50,000 条新记录,我不需要这样做。如果具有给定 userId 的记录不存在,我只需要创建新记录,但如果具有给定 ID 的记录存在,则更新记录。如果我的地图函数按顺序调用 updateGameScore 函数,这将正常工作,但不幸的是它没有。请帮我解决这个问题,因为我对异步 js 的了解非常少。
javascript - 如何在所有代码执行之前停止响应,使用异步等待
我有一个名为 getActiveUsers 的函数,它可以帮助我找到活跃用户
我首先想从 Reward 集合中获取数据,它将 100 条记录返回到奖励数组。在等待所有结果之后,我想将检索到的数组(rewards)一个一个地遍历,并从另一个名为Callback的集合中获取数据。这些数据将被一个一个地推送到另一个名为 results 的数组中。(我为此使用了 map 函数)在等待所有 100 条记录到 results 数组之后,我想将其作为响应发送。但不幸的是,我的代码不等待地图功能。它以空数组(结果)的形式发送响应。然后运行地图并将元素推送到结果数组。请仅使用 async/await 帮助我解决此问题。如果不可能,请给我最好的解决方案。