问题标签 [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 和 Await 不适用于 Axios React
我正在尝试用我的电脑和手机在本地测试我的 react 项目。我使用的是 JavaScript 而不是 TypeScript。当我在计算机上运行该项目时,一切正常,但是当我尝试将其加载到手机上时,出现错误:Unhandled Rejection (TypeError): undefined is not an object (evaluating 'scheduleArr.forEach')
. 我认为我正在使用async
并且await
正确,因为此代码在我的计算机上运行。我很困惑为什么这段代码可以在一个平台上工作,但不能在另一个平台上工作。
我认为这个问题直接相关async
,await
因为当我注释掉这个函数时,我的项目在我的手机上正确加载。
谁能帮我理解我做错了什么?
javascript - Javascript 异步网络爬虫
我有一个异步函数,可以从 csv 文件中读取网站列表。
每次我阅读一个网站时,我都会调用 check_page 函数来执行一些操作。每次我有一个,我都会等待它的结束,然后再开始新的站点。
到目前为止,它可以正常工作,但现在我必须将我的代码与网络爬虫集成。在readCSV
函数内部,我必须为我阅读的每个站点以及每个我应该调用check_page
函数的站点调用它。
现在我readCSV
以这种方式编辑:
我正在将此代码用于网络爬虫:https ://www.npmjs.com/package/js-crawler
这个函数现在不起作用,因为它不是异步的。如何更改我的代码?
现在我有这个错误:
(节点:907) UnhandledPromiseRejectionWarning:未处理的承诺拒绝。此错误源于在没有 catch 块的情况下抛出异步函数内部,或拒绝未使用 .catch() 处理的承诺。要在未处理的 Promise 拒绝时终止节点进程,请使用 CLI 标志--unhandled-rejections=strict
(请参阅https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode)。(拒绝 ID:2)(节点:907)[DEP0018] DeprecationWarning:不推荐使用未处理的承诺拒绝。将来,未处理的 Promise 拒绝将使用非零退出代码终止 Node.js 进程。
javascript - 如何修复此错误 - > Uncaught (in promise) SyntaxError: Unexpected end of input In Fetch Api
我在单击按钮时调用此函数。我在我的 API 中添加了一个标头,但它仍然显示错误。
let getData = () => { console.log("getData 函数开始");
javascript - Javascript 异步函数中的错误处理。概念查询。在 node.js 中为多层提供伞式 try-catch 的可能性
查询:
为什么 try 块没有捕获 Javascript 中异步方法中的错误?可以从执行上下文的角度来理解吗?
有没有一种方法可以将所有错误处理包装在入口文件或更高级别?
上下文:在 PHP 中的多层应用程序(例如控制器、服务、DAO)中,控制器层中的伞式 try-catch 块可以捕获任何较低层中的错误。是否可以在 node.js 中做类似的事情?
javascript - 为什么我的 JavaScript 异步函数在其他所有内容都完成后才运行?
我很难理解 javascript 异步函数是如何工作的。在我的实际用例中,有问题的函数是第 3 部分 API 调用,但简单的 setTimeout 函数是重现我的问题的更简单方法。
我希望代码无限循环,直到设置时间函数完成,然后退出循环并继续程序。在此示例中,我希望/期望输出为“设置超时:5”,然后是“设置超时:5”,但它无限循环,表明 setTimeout 函数甚至从未运行。
我也尝试过不使用循环并在await
之前放置,setTimeout(function()
但它会打印“超出设置超时:1”,然后是“设置超时:5”。
TLDR:我希望我的代码以同步方式使用异步函数。
javascript - Eloquent Javascript 一书中第 181 页第 11 章:异步编程中给出的图表中的差距是什么意思?
我正在阅读“Eloquent Javascript”,第 11 章异步编程,第 181 页给出了一张图表,对比了发送两个网络请求的情况下单线程、多线程和异步技术的差异。黑点代表时间线中提出请求的点。细线表示等待响应所花费的时间。粗线代表正常的程序执行。我的疑问是时间线上的差距。作者没有提到它们代表什么,所以我很难在概念上做出精确的区分。感谢您对理解的任何帮助。
异步模型允许同时发生多件事。当你开始一个动作时,你的程序会继续运行。当操作完成时,程序会收到通知并可以访问结果(例如,从磁盘读取的数据)。
我们可以用一个小例子来比较同步和异步编程:一个从网络中获取两个资源然后组合结果的程序。
在同步环境中,请求函数仅在完成其工作后才返回,执行此任务的最简单方法是一个接一个地发出请求。这样做的缺点是只有在第一个请求完成后才会启动第二个请求。花费的总时间将至少是两个响应时间的总和。
在同步系统中,这个问题的解决方案是启动额外的控制线程。线程是另一个正在运行的程序,其执行可能会被操作系统与其他程序交错执行——因为大多数现代计算机都包含多个处理器,因此多个线程甚至可以同时在不同的处理器上运行。第二个线程可以启动第二个请求,然后两个线程都等待它们的结果返回,然后它们重新同步以组合它们的结果。
在下图中,粗线表示程序正常运行所花费的时间,细线表示等待网络所花费的时间。在同步模型中,网络所花费的时间是给定控制线程时间线的一部分。在异步模型中,开始一个网络动作在概念上会导致时间线的分裂。启动动作的程序继续运行,动作随之发生,完成时通知程序。
javascript - 为什么这些关于 timer(setTimeout()) 的代码,Promises 的 then() 方法是这样运行的?
解释代码:
正如你在上面看到的,我创建了一个wait()
返回承诺的函数,在这个函数中,resolve()
将立即执行,以及一个将在 5 秒后记录“a”消息的计时器。
我所期望的:
所以我期望的是该then()
方法将被执行,它then()
立即移动到该方法,所以从这里它将记录“b”消息。并且由于 5 秒计时器在后台等待,在 Web API 中,'a' 消息将在 'b' 消息之后记录。
它实际上做了什么:
但是结果是如此不同,两条消息都立即同时记录,并且'a'在'b'之前,5秒还没有过去。大家能不能帮我解释一下,我不太明白,我认为我对then()
方法的理解是错误的,所以请知道的帮我修复,非常感谢!
javascript - React hooks:如何检测特定状态变量何时更新
在 React 钩子之前,我会使用componentDidUpdate(prevProps, prevState)
,如果我只想在this.state.a
更新后执行给定的代码,我会这样做
我怎样才能实现同样的目标useEffect()
?
javascript - JavaScript 调用堆栈中的变量如何在函数返回后仍可访问
混淆的两点:
- 功能框架是如何保存和处置的?
例子:
在这个例子中,setTimeout 中的内部函数正在引用外部变量 a,即使在 foo 返回之后也是如此。来自 Java 世界,我很困惑这怎么会发生?foo 堆栈帧如何存储以供内部函数使用,何时从堆栈中弹出?
- 多个异步/承诺“返回”
例子:
在其他地方:
假设先发生超时调用,然后 dbcall 返回。承诺可能会被解决两次。
问题:超时调用拒绝后,该函数是否仍会继续(a)等待 db 调用返回,然后执行等待之后的任何代码?第二次履行承诺会发生什么(即等待完成时的解析调用)是否只有第一次解析/拒绝得到处理?
javascript - Marko 中的多个承诺
在 Marko 中,一个多个 promise 如何<await>
并行?
例如,我正在寻找这样的东西: