首页 > 其他分享 >js 异步函数的返回值

js 异步函数的返回值

时间:2024-01-20 19:00:48浏览次数:25  
标签:function 异步 console log js 返回值 async foo 函数

函数可以得到它返回的期约:

async function foo() { console.log(1); return 3;
}
// 给返回的期约添加一个解决处理程序
foo().then(console.log);
    console.log(2);
// 1 // 2 // 3
  当然,直接返回一个期约对象也是一样的:
async function foo() { console.log(1);
return Promise.resolve(3);
}
// 给返回的期约添加一个解决处理程序 foo().then(console.log);
    console.log(2);
// 1 // 2 // 3
异步函数的返回值期待(但实际上并不要求)一个实现 thenable 接口的对象,但常规的值也可以。 8 如果返回的是实现 thenable 接口的对象,则这个对象可以由提供给 then()的处理程序“解包”。如果 不是,则返回值就被当作已经解决的期约。下面的代码演示了这些情况:
10 return ['bar']; 11
// 返回一个原始值
async function foo() {
return 'foo'; }
 foo().then(console.log); // foo
// 返回一个没有实现 thenable 接口的对象 async function bar() {
 } bar().then(console.log); // ['bar']
// 返回一个实现了 thenable 接口的非期约对象 async function baz() {
  const thenable = {
    then(callback) { callback('baz'); }
12
  }; 13
return thenable; }
baz().then(console.log); // baz
/ 返回一个期约
async function qux() {
return Promise.resolve('qux'); }
qux().then(console.log); // qux
  与在期约处理程序中一样,在异步函数中抛出错误会返回拒绝的期约:
async function foo() { console.log(1); throw 3;
}
// 给返回的期约添加一个拒绝处理程序 foo().catch(console.log); console.log(2);
// 1 // 2 // 3
  不过,拒绝期约的错误不会被异步函数捕获:
async function foo() { console.log(1); Promise.reject(3);
}
    // Attach a rejected handler to the returned promise
    foo().catch(console.log);
    console.log(2);
// 1
// 2
// Uncaught (in promise): 3

ES8 的 async/await 旨在解决利用异步结构组织代码的问题。为此,ECMAScript 对函数进行了扩展, 为其增加了两个新关键字:async 和 await。 1. async async 关键字用于声明异步函数。这个关键字可以用在函数声明、函数表达式、箭头函数和方法上: async function foo() {}

let bar = async function() {};
let baz = async () => {};
class Qux { async qux() {}
}

使用 async 关键字可以让函数具有异步特征,但总体上其代码仍然是同步求值的。而在参数或闭 包方面,异步函数仍然具有普通 JavaScript 函数的正常行为。正如下面的例子所示,foo()函数仍然会 在后面的指令之前被求值:

标签:function,异步,console,log,js,返回值,async,foo,函数
From: https://blog.51cto.com/u_16298172/9346044

相关文章

  • 池和异步回调机制
    池【1】概念池是用来保证计算机硬件安全的情况下,最大限度的利用计算机资源,降低了程序的运行效率,但是保证了计算机硬件的安全池(Pool)的概念在计算机科学和软件工程中常被用于资源管理,尤其是在多线程或并发编程中。池是一种管理和优化资源分配的机制,它事先分配一定数量的资源(......
  • 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......
  • Python异步编程原理篇之协程的IO
    协程的IOasyncio作为实现异步编程的库,任务执行中遇到系统IO的时能够自动切换到其他任务。协程使用的IO模型是IO多路复用。在asyncio低阶API一篇中提到过“以Linux系统为例,IO模型有阻塞,非阻塞,IO多路复用等。asyncio常用的是IO多路复用模型的epool和kqueue”。本篇就介绍一......
  • 异步与自动化
    异步数据之前爬取的网站基本上都是同步数据,每一页的内容都不需要再次加载,而是通过翻页获取更多数据;其实有很多网站显示在页面上的的数据并不是一次性从服务端获取的,如图像搜索网站,当滚动下拉条时,会随着滚动条向下移动,有更多的图片显示出来。这些图片就是通过异步的方不断从服务端......
  • telegraf解析嵌套json遇到的问题
    问题描述kafka中的数据格式如下:{"customerId":1652,"deviceId":"13011304383","timestamp":1705637828000,"parameters":{"acc":0,"locationStatus":1,&......
  • 美多商城用户注册-展示用户注册页面-短信验证码异步方案Celery-8
    生产者消费者设计模式生产设消费者设计模式介绍Celery介绍使用:Celery介绍:一个简单、灵活且可靠、处理大量消息的分布式系统,可以在一台或者多台机器上运行。单个Celery进程每分钟可处理数以百万计的任务。通过消息进行通信,使用消息队列(broker)在客户端和消费者之间进行协调......