首页 > 其他分享 >js 停止和恢复执行

js 停止和恢复执行

时间:2024-01-20 19:01:13浏览次数:27  
标签:function foo console log await js 停止 async 执行

使用 await 关键字之后的区别其实比看上去的还要微妙一些。比如,下面的例子中按顺序调用了 3 个函数,但它们的输出结果顺序是相反的:

async function foo() {
     console.log(await Promise.resolve('foo'));
    }8
async function bar() {
 console.log(await 'bar');
}
async function baz() {
 console.log('baz');
}
foo();
bar();
baz();
// baz
// bar
// foo

async/await 中真正起作用的是 await。async 关键字,无论从哪方面来看,都不过是一个标识符。 12 毕竟,异步函数如果不包含 await 关键字,其执行基本上跟普通函数没有什么区别:

async function foo() {
  console.log(2);
}
console.log(1);
foo();
console.log(3);

要完全理解 await 关键字,必须知道它并非只是等待一个值可用那么简单。JavaScript 运行时在碰 到 await 关键字时,会记录在哪里暂停执行。等到 await 右边的值可用了,JavaScript 运行时会向消息 队列中推送一个任务,这个任务会恢复异步函数的执行。 因此,即使 await 后面跟着一个立即可用的值,函数的其余部分也会被异步求值。下面的例子演 示了这一点:

async function foo() {
      console.log(2);
      await null;
      console.log(4);
}
    console.log(1);
    foo();
    console.log(3);
    // 1
    // 2
    // 3
    // 4

控制台中输出结果的顺序很好地解释了运行时的工作过程: (1) 打印 1; (2) 调用异步函数 foo(); (3)(在 foo()中)打印 2; (4)(在 foo()中)await 关键字暂停执行,为立即可用的值 null 向消息队列中添加一个任务; (5) foo()退出; (6) 打印 3; (7) 同步线程的代码执行完毕; (8) JavaScript 运行时从消息队列中取出任务,恢复异步函数执行; (9)(在 foo()中)恢复执行,await 取得 null 值(这里并没有使用); (10)(在 foo()中)打印 4; (11) foo()返回。 如果 await 后面是一个期约,则问题会稍微复杂一些。此时,为了执行异步函数,实际上会有两个 任务被添加到消息队列并被异步求值。下面的例子虽然看起来很反直觉,但它演示了真正的执行顺序:1

async function foo() {
      console.log(2);
      console.log(await Promise.resolve(8));
      console.log(9);
}
    async function bar() {
}

标签:function,foo,console,log,await,js,停止,async,执行
From: https://blog.51cto.com/u_16273048/9346042

相关文章

  • js await 的限制
    等待会抛出错误的同步操作,会返回拒绝的期约:```jsasyncfunctionfoo(){console.log(1);await(()=>{throw3;})();}//给返回的期约添加一个拒绝处理程序foo().catch(console.log);console.log(2);//1//2//3```如前面的例子所示,单独的Promise.reject()不会被异步函......
  • js 异步函数的返回值
    函数可以得到它返回的期约:asyncfunctionfoo(){console.log(1);return3;}//给返回的期约添加一个解决处理程序foo().then(console.log);console.log(2);//1//2//3当然,直接返回一个期约对象也是一样的:asyncfunctionfoo(){console.log(1);returnProm......
  • Hive SQL底层执行过程详细剖析
     本文结构采用宏观着眼,微观入手,从整体到细节的方式剖析HiveSQL底层原理。第一节先介绍Hive底层的整体执行流程,然后第二节介绍执行流程中的SQL编译成MapReduce的过程,第三节剖析SQL编译成MapReduce的具体实现原理。HiveHive是什么?Hive是数据仓库工具,再具体点就......
  • Visual Studio Code 解决JSON中不允许注释?
    1.使用vscode打开json文件后,一些注释显示如图所示,有红色波浪线,影响阅读 2.悬浮在波浪线报错信息,会弹出提示ViewProblem,提示问题是:json文件中不允许注释 3.下面图片表示json文件中不允许注释 4.点击底部工具栏的JSON 5.弹出的窗口中输入jsonwithComments,找......
  • hyperexpress框架/使用uwebsockets.js核心
    import{scheduleJob}from'node-schedule';//定时任务functionsetupScheduledTasks(){//每6秒执行一次setInterval(()=>{taskEverySixSeconds();},6000);//每33分钟执行一次setInterval(()=>{taskEve......
  • 模块-包-commandJs
    模块、包、commandJs01为什么要有模块化开发? 在传统的nodejs代码开发中,把js文件拆分开来有很糟糕的编程体验,在开发者引入的js文件时,方法名相同时后者将覆盖前面的方法去执行 我们可以把公共的功能抽离成为一个单独的JS文件作为一个模块,默认情况下这个模块里面的方法或书写,......
  • Servlet(JSP)学习笔记
    目录IDEA配置JSP基本语法page指令ScriptLet标签注释包含跳转JSP四大作用域applicationsessionrequestpageJSP九大内置对象responseoutpageContextconfigexceptionJavaBean组件JavaBean组件引入创建JavaBean设置属性值获取属性值JavaBean的保存范围JavaBean的删除ServletHelloWorld......
  • uWebSockets.js 框架经验
    目录结构project/│├──src/│├──app.ts│├──routes/││├──userRoutes.ts││└──index.ts│├──entities/││└──User.ts│├──utils/││└──parseQuery......
  • telegraf解析嵌套json遇到的问题
    问题描述kafka中的数据格式如下:{"customerId":1652,"deviceId":"13011304383","timestamp":1705637828000,"parameters":{"acc":0,"locationStatus":1,&......
  • Dynamics 365 事件执行管道
    MicrosoftDynamics365事件处理子系统根据消息管道执行模型执行插件。MicrosoftDynamics365Web应用程序中的用户操作或者插件或其他应用程序执行的SDK方法调用会导致将消息发送到组织Web服务。该消息包含业务实体信息和核心操作信息。该消息是通过事件执行管道传递......