在同步函数中等待Promise.all,基本上是阻塞的! javascript

2024-01-28

我有很多我想要执行的同步函数,之前是基本的ajax请求,这些请求将把html渲染到DOM。

为了做到这一点,我必须同步执行所有这些 一一要求。但我不知何故希望这些同步功能同时异步,并等待它们完成以加快速度。这必须发生在同步函数内。但我的理解是这在 javascript 中不起作用,但我想听听你们要说什么。

所以我的尝试是将所有这些同步请求添加到异步承诺中,然后进行 Promise.all 调用。我等不及 Promise.all().then 因为主线程将在这个主同步线程/函数之后继续执行其余的代码。所以我想知道是否有一种方法可以阻止主线程以等待这些异步调用

这是我正在谈论的内容的简短说明

var syncfunc = () => {
var getPromise = () => {
    return new Promise((resolve) => {
        var asyncAjaxRequest = async function() {
            doSomeStuff();
            resolve();
        }
    })
}
var promises = [getPromse(), getPromse(), getPromse()];


Promise.all(promises);

console.log('i want this console.log to execute after all promises executed doSomeStuff');

/**
 * 
 * Promise.all(promises).then(() => {
        // I cant use this, because its script in other files that will execute if i wait like this
    })
 */
}

我知道 .then 将在所有解析完成后执行,但我基本上想阻止此同步线程,等待所有其他异步完成。

如果可以的话,我当然会根据我的需要更改结构,但问题和我尝试这样做的原因是因为我使用 sitevision 框架,并且想要在打印模块打开打印窗口之前向 dom 添加一些内容。同步调用每个函数并不是正确的方法,它会很慢。我还尝试设置 window.print = null 来禁用打印功能,然后在 Promise 解析时将打印功能添加回来,但它根本不起作用


您无法使用纯 JavaScript(无需外部代码)将异步操作转变为同步操作。事件驱动的 JS 引擎并不是这样工作的。

根据定义,异步操作启动操作(将执行交给本机代码),然后返回到解释器,然后解释器继续执行后面的代码。当完成时,本机代码将向 JS 事件队列添加一个事件,以允许解释器事件循环为异步操作的完成提供服务。如果您创建某种“块”,例如半无限 while 循环,这将“阻止”解释器执行更多代码,那么您最终会陷入僵局。阻塞解释器的循环会阻止 JS 解释器处理指示异步操作结束的事件。因此,您有一个循环等待某件事完成,但它正在等待的事情在循环完成之前无法完成 - 僵局。

因此,由于 JS 解释器的单线程事件循环性质,您不能(纯粹在 Javascript 中)阻塞等待异步操作的结束。

几乎总是,正确的设计是重构周围的代码/基础设施以处理异步操作和异步结果(回调或承诺)。


如果这是 Node.js,有一些可怕的黑客可以让你得到这个结果,但它们会阻止整个解释器,所以几乎从来都不是理想的设计。

第一个选项涉及编写一个自定义 Nodejs 插件(在本机代码中完成的异步操作),该插件提供一个阻塞接口,该接口在操作完成之前不会返回。

第二个选项涉及使用同步子进程操作 https://nodejs.org/api/child_process.html#child_process_synchronous_process_creation(例如child_process.execFileSync()要创建阻塞子进程,请在该子进程中运行代码,然后在该进程完成后继续。

我认为这两者都是非常糟糕的黑客行为,而且几乎从来都不是解决此类问题的理想方法。但是,我确实想向您展示必须做什么才能阻止异步操作(必须将其移出 Javascript 或移出进程)。


如果您无法弄清楚如何通过非阻塞异步操作解决您的实际问题,我建议您发布一个新问题,在其中详细描述真正的问题是什么,我们可以帮助您找到异步设计这适合你的情况。如果您在此处的评论中发布指向新问题的链接,这里参与的一些人可能会检查新问题并尝试提供帮助。

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

在同步函数中等待Promise.all,基本上是阻塞的! javascript 的相关文章

  • 如何使用 ajax 调用(即 Select2)填充 WTForms SelectField?

    我正在尝试使用 Flask WTForms Select2 ajax 调用 实现一个网络应用程序 但不幸的是没有取得巨大成功 主要问题与我的 WTForms 类之一中的属性 choices 有关 因为我无法理解如何使用 ajax 调用填充选
  • 使用 WMI 查找服务的依赖关系,然后区分依赖的服务和依赖的驱动程序

    MSDN 上有一个代码示例 它使用 WMI 枚举特定服务的所有依赖项 http msdn microsoft com en us library aa393673 v vs 85 aspx http msdn microsoft com e
  • Javascript 与 Python 关于 Python 'map()' 函数的比较

    Python中有一个函数叫做map这可以让你去 map someFunction x y z 并继续应用该功能的列表 是否有与此功能等效的 JavaScript 我现在刚刚学习Python 虽然我被告知javascript是函数式语言 但我
  • 如何检查c#代码中死锁的可能性

    我的应用程序有时会停止在下面的代码中 并非总是如此 但有时会停止 全部3种方法CalcQuarterlyFigures CalcWeeklyFigures CalcMonthlyFigures return Task
  • HTML5 服务器端事件:EventSource 与包装的 WebSocket

    HTML5 服务器发送事件 SSE API 是否只是 HTML5 WebSocket 之上的受限制的 基于事件的 API 在我看来 一个EventSource只是一个WebSocket that Cannot send data 使用tex
  • JQuery 动画文本

    找到简单 简单的动画文本是非常困难的 喜欢这个网站上的 内爆 http codecanyon net item jquery text animation full screen preview 233445 http codecanyon
  • 向对象添加元素

    我需要填充一个 json 文件 现在我有这样的东西 element id 10 quantity 1 我需要添加另一个 元素 我的第一步是使用该 json 将该 json 放入对象类型中cart JSON parse 现在我需要添加新元素
  • Telegram 授权无默认按钮

    使用 Telegram 第 3 方授权的唯一有记录的方法是使用其提供的脚本https core telegram org widgets login https core telegram org widgets login 这个脚本 正如
  • 提交前验证表单(比检查空字段更复杂)

    我有一个包含时间输入的表单 具体来说 开放时间和结束时间 当按下提交按钮时 它会转到一个 php 页面 其中这些输入将添加到数据库中 在允许提交表单之前我想检查一些事情 例如 我想确保开始时间早于 小于 结束时间 这是表格 Opens
  • 光滑的轮播缓动示例

    我正在使用 Slick Carousel http kenwheeler github io slick http kenwheeler github io slick 但不知道如何合并不同的幻灯片切换 有人有例子可以分享吗 这是我目前拥有
  • JQuery DataTable 单元格从行单击

    我正在尝试在 jquery 数据表上实现一个函数 该函数返回单击行的第一列和第四列 我正在遵循这个示例 它允许我操作单击的行http datatables net examples api select single row html ht
  • 点击问题:动态生成的链接不触发点击功能

    下面是两个代码片段 由于某种原因什么也没有发生 但来自同一个 JS 文件的其他 jQuery 函数在带有 UL 的页面上执行得很好 这是在盯着我看吗 ul class paganation li 1 li li a href 2 a li
  • 空 URL 哈希导致页面在 js 事件上跳转

    我有一个带有下一个和上一个按钮的照片库 如果我的某个 javascript 方法由于某种原因被破坏 那么当单击其中一个按钮时 它会向 url 添加一个哈希值 即 www google com 我知道可以给散列一个 div id 来跳转到页面
  • 使用 onBlur 事件上的值更新 React 输入文本字段

    我有以下输入字段 在模糊时 该函数调用服务来更新服务器的输入值 完成后 它会更新输入字段 我怎样才能让它发挥作用 我可以理解为什么它不允许我更改字段 但我能做些什么才能使其工作 我无法使用defaultValue因为我会将这些字段更改为其他
  • 将 NPM 包客户端与 nuxt 结合使用

    我对 nuxt 和 javascript 非常陌生 我正在尝试弄清楚如何在客户端使用我的应用程序的依赖项 我将它们列在我的 nuxt config js 中并使用 npm 安装 我也有一个文件 plugins导入它们的目录 不确定这是否好
  • 理论上防止 WebSocket 中第一个收到的消息丢失

    服务器端代码发送消息立即地连接打开后 它向客户端发送初始配置 问候语 以下代码是在客户端 var sock new WebSocket url sock addEventListener error processError sock ad
  • Meteor.js 登录事件

    因此 我对 Meteor 框架和 JavaScript 总体来说还很陌生 但我正在使用该框架开发一个小项目 以尝试让自己达到标准 基本上我正在开发一个微博客网站 目前 用户可以通过多种服务登录 fb google 等 我通过插入所需 url
  • 使用Promise而不拒绝它会导致内存泄漏吗? [复制]

    这个问题在这里已经有答案了 代码如下 function test value return new Promise function fulfill reject try fulfill true catch e throw e 我担心的是
  • 在声明组件选择器时添加指令 - Angular 7

    我正在学习 Angular 并通过单击按钮动态创建组件 我正在尝试使用 Angular Material 的拖放功能来拖动这些创建的组件以对它们进行排序 我的基本组件 html 中有以下代码 div style margin 20px di
  • 在 Google Apps 脚本中的文本前插入换行符

    我需要在 Google 文档中的某些文本之前插入一些换行符 尝试过这种方法但出现错误 var body DocumentApp getActiveDocument getBody var pattern WORD 1 var found b

随机推荐