JavaScript Promise 是异步的吗?

2023-12-07

只是一个简单的澄清问题:JavaScript 是Promise异步?我读了很多关于Promise和异步编程(即ajax请求)。如果Promise不是异步的,我们如何做到这一点?

例如,我有一个函数来包装一个函数f带参数数组args里面一个Promise。没有关于f本质上是异步的。

function getPromise(f, args) {
 return new Promise(function(resolve, reject) {
  var result = f.apply(undefined, args);
  resolve(result);
 });
}

为了使这个异步,我阅读了一些SO帖子并决定setTimeout是很多人建议使代码非阻塞的方法。

function getPromise(f, args) {
 return new Promise(function(resolve, reject) {
  setTimeout(function() { 
   var r = f.apply(undefined, args);
   resolve(r);
  }, 0);
 });
}

这种方法会与setTimeout努力使代码在a内非阻塞Promise?

(请注意,我不依赖任何第三方 Promise API,仅依赖浏览器支持的 API)。


我认为你是在误解下工作的。 JavaScript 代码是总是*阻塞;这是因为它在单个线程上运行。 Javascript 中异步编码风格的优点是 I/O 等外部操作不需要阻塞该线程。但处理 I/O 响应的回调仍然处于阻塞状态,并且没有其他 JavaScript 可以同时运行。

* 除非您考虑运行多个进程(或浏览器上下文中的 WebWorkers)。

现在针对您的具体问题:

只是一个简单的澄清问题:JavaScript Promise 是异步的吗?

不,传递到 Promise 构造函数中的回调会立即同步执行,尽管绝对可以启动异步任务,例如超时或写入文件,并等到异步任务完成后再解析 Promise;事实上,这是 Promise 的主要用例。

这种使用 setTimeout 的方法是否可以使 Promise 内的代码非阻塞?

不,它所做的只是改变执行顺序。脚本的其余部分将执行直到完成,然后当没有其他事情可做时,将执行 setTimeout 的回调。

为了澄清:

    console.log( 'a' );
    
    new Promise( function ( ) {
        console.log( 'b' );
        setTimeout( function ( ) {
            console.log( 'D' );
        }, 0 );
    } );

    // Other synchronous stuff, that possibly takes a very long time to process
    
    console.log( 'c' );

上面的程序确定性地打印:

a
b
c
D

这是因为 setTimeout 的回调将不会执行,直到主线程无事可做(在记录“c”之后)。

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

JavaScript Promise 是异步的吗? 的相关文章

随机推荐

  • CakePHP元素错误处理问题

    我的登录和注册表单位于引用用户控制器以及 login 和 register 操作的元素中 例如 当我在模式或页面控制器操作中使用此元素时 当用户出现验证错误 即模型验证 时 它会重定向到登录 注册操作页面 而不是更新元素 我意识到我可以使用
  • 滚动视图中作为列表项的内容在滚动时消失(swiftui),为什么?

    Asperi 的解决方案 ScrollView id UUID uuidString 列表项中有一个滚动视图 当我滚动列表时 滚动视图中的内容消失 我认为问题在于滚动视图和列表可重用项目冲突 如果我删除滚动视图 只是 hstack 什么都不
  • 在控制器中运行 rake 任务

    我想在我的控制器中运行 rake 任务 有什么办法可以做到这一点吗 我同意 ddfreynee 的观点 但如果你知道你需要什么 代码可能如下所示 require rake Rake Task clear necessary to avoid
  • 在 Google 表格中查找评论的位置

    我能够检索电子表格的所有评论 但是 我想知道评论所锚定的确切工作表和单元格范围 我查看了 Comments list 方法返回的评论资源的锚属性中的值 var commentsResource Drive Comments list ss
  • Gmail 中的 while(1) 有何作用[重复]

    这个问题已经存在了 可能的重复 为什么要有 while 1 在 XmlHttpRequest 响应中 如果您查看 Gmail 在更新电子邮件列表时向服务器发出的 XHR POST 请求 您将看到每个响应都以以下内容开头 while 1 v
  • PHP:当多个表单字段共享相同的名称和 ID 时使用 post

    这个标题可能没有多大意义 但我拥有的是动态生成的表单 我连接到产品表 取出其中的名称 然后 我创建一个表单 显示产品 旁边有一个复选框和文本框
  • 强制 free() 将 malloc 内存返回给操作系统

    似乎即使在我释放了由 分配的 Linux 进程的所有内存之后malloc 内存仍为进程保留 不会返回给操作系统 Running valgrind massif默认情况下 工具不会显示任何泄漏 Running valgrind with pa
  • 如何在 xamarin iOS 中使用 AVPlayerViewController (AVKit) 播放视频

    如何在xamarin iOS中使用AVPlayerLayer和AVPlayerViewControler播放视频 playerItem new AVPlayerItem new NSUrl https clips vorwaerts gmb
  • 对 Javascript 代码进行反混淆处理,使其再次可读[重复]

    这个问题在这里已经有答案了 我讨厌把这个带到这里 在学习混淆 JS 代码的同时 我对代码进行了编码 然后在没有任何备份的情况下重写了原始代码 以下是我的混淆代码 var 0xf17f x28 x29 x64 x69 x76 x63 x72
  • 如何在 R 中导出 HTML 表格并控制线条边框?

    R 中是否有任何函数允许将 HTML 表格导出为 R Markdown 或相关编织文档的一部分 并允许对表格行边框进行详细控制 例如 想象一个这样的矩阵 x lt matrix c M F Good 23 17 Bad 23 4 nrow
  • 将矢量资源导入 Android Studio 时出错

    我在 Illustrator 中创建了一个简单的播放按钮图像 将其保存为 SVG 使用在线 SVG to Drawable 转换器创建该文件的 xml 然后尝试使用 Android Studio 的 Vector Asset 工具将该文件导
  • jQuery DataTables - 子行和“未定义不是函数”

    我正在努力将子行添加到数据表中 但对于在不同表和页面上完美运行的一行代码 出现 类型错误 未定义不是函数 有任何想法吗 HTML div class table responsive h2 class sub header Account
  • 限制滚动和缩放 Google Maps Android API v2

    我已经添加地面叠加层映射并希望限制该区域内的滚动和缩放 如何限制 Android 谷歌地图上的某些范围内的滚动 是否可以从 MapFragment 获取即时运动点 请帮我 约束相机 终于 作为一项功能添加到了发布的版本中谷歌播放服务 9 4
  • Sublime Text 3 sftp插件代理设置

    我已经为 Sublime Text 3 安装了 sftp 插件 是否可以使用代理配置 sftp 我正在寻找任何代理设置 有人知道这件事吗 Use ProxyCommand inside sftp flags 这样的事情对我有用 Destin
  • android NDK可以编译内核模块源吗?

    我想为 android 制作一个动态加载的内核模块 我不想安装linux 我只有cygwin和android NDK 是的 可以使用 NDK 构建内核模块 请注意 这在 Linux 系统上效果最好 据我所知 Linux x86 64 是受支
  • 如何在Scheme中计算一个数的各位数字之和?

    我想计算Scheme中一个数字的数字之和 它应该像这样工作 gt sum of digits 123 6 我的想法是改变数字123串起来 123 然后将其转换为列表 1 2 3 然后使用 apply 1 2 3 to get 6 但不幸的是
  • 在 PHP 中从 MySQL 中提取 BLOB 图像数据

    我正在阅读一些关于如何将图像作为二进制上传到数据库而不是将它们放在服务器本身上的教程 我让它像这样工作 PHP image chunk split base64 encode file get contents tmpfile mysql
  • 批评我的堆调试器

    我编写了以下堆调试器 以演示内存泄漏 双重删除和错误形式的删除 即尝试使用以下命令删除数组 delete p代替delete p 给初级程序员 我很想从强大的 C 程序员那里得到一些反馈 因为我以前从未这样做过 而且我确信我犯过一些愚蠢的错
  • 当启用 Visual-line-mode 时,如何使用 hl-line-mode 仅突出显示一 (1) 行

    有没有人有替代方案或修改方案hl line mode这样只有一 1 条水平线才会突出显示visual line mode已启用 目前 整条自动换行的行都会突出显示 即使它可能跨越几条水平线 我正在使用 Emacs Trunk 的最新版本 您
  • JavaScript Promise 是异步的吗?

    只是一个简单的澄清问题 JavaScript 是Promise异步 我读了很多关于Promise和异步编程 即ajax请求 如果Promise不是异步的 我们如何做到这一点 例如 我有一个函数来包装一个函数f带参数数组args里面一个Pro