首页 > 其他分享 >js await 的限制

js await 的限制

时间:2024-01-20 19:00:59浏览次数:18  
标签:function console log await js Promise 限制 foo

等待会抛出错误的同步操作,会返回拒绝的期约:

```js

async function foo() { console.log(1);

await (() => { throw 3; })();

}

// 给返回的期约添加一个拒绝处理程序 foo().catch(console.log); console.log(2);

// 1 // 2 // 3

```


如前面的例子所示,单独的 Promise.reject()不会被异步函数捕获,而会抛出未捕获错误。不 过,对拒绝的期约使用 await 则会释放(unwrap)错误值(将拒绝期约返回):

```js

async function foo() { console.log(1);

await Promise.reject(3); console.log(4); // 这行代码不会执行

}

// 给返回的期约添加一个拒绝处理程序 foo().catch(console.log); console.log(2);

// 1 // 2 // 3

```


## 1. await 的限制

await 关键字必须在异步函数中使用,不能在顶级上下文如<script>标签或模块中使用。不过,

定义并立即调用异步函数是没问题的。下面两段代码实际是相同的:

```js

  async function foo() {

     console.log(await Promise.resolve(3));

} foo(); // 3

// 立即调用的异步函数表达式 (async function() {

     console.log(await Promise.resolve(3));

})();

// 3

```


此外,异步函数的特质不会扩展到嵌套函数。因此,await 关键字也只能直接出现在异步函数的定 义中。在同步函数内部使用 await 会抛出 SyntaxError。

 下面展示了一些会出错的例子:

```js

// 不允许:await 出现在了箭头函数中 function foo() {

     const syncFn = () => {

       return await Promise.resolve('foo');

     };

     console.log(syncFn());

     }

// 不允许:await 出现在了同步函数声明中 function bar() {

     function syncFn() {

       return await Promise.resolve('bar');

}

     console.log(syncFn());

   }

// 不允许:await 出现在了同步函数表达式中 function baz() {

     const syncFn = function() {

       return await Promise.resolve('baz');

};

     console.log(syncFn());

   }

// 不允许:IIFE 使用同步函数表达式或箭头函数 function qux() {

(function () { console.log(await Promise.resolve('qux')); })();

     (() => console.log(await Promise.resolve('qux')))();

   }

     ```


await 关键字期待(但实际上并不要求)一个实现 thenable 接口的对象,但常规的值也可以。如 果是实现 thenable 接口的对象,则这个对象可以由 await 来“解包”。如果不是,则这个值就被当作 已经解决的期约。下面的代码演示了这些情况:

```js

// 等待一个原始值

async function foo() {

console.log(await 'foo'); }

foo(); // foo

// 等待一个没有实现 thenable 接口的对象 async function bar() {

console.log(await ['bar']); }

// ['bar']

// 等待一个实现了 thenable 接口的非期约对象 async function baz() {

 const thenable = {

   then(callback) { callback('baz'); }

};

console.log(await thenable); }

baz(); // baz

  // 等待一个期约 13 async function qux() {

console.log(await Promise.resolve('qux')); }

qux();

```

标签:function,console,log,await,js,Promise,限制,foo
From: https://blog.51cto.com/u_16298168/9346043

相关文章

  • js 异步函数的返回值
    函数可以得到它返回的期约:asyncfunctionfoo(){console.log(1);return3;}//给返回的期约添加一个解决处理程序foo().then(console.log);console.log(2);//1//2//3当然,直接返回一个期约对象也是一样的:asyncfunctionfoo(){console.log(1);returnProm......
  • 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......
  • nginx设置开机启动后配置没生效 | selinux不限制nginx
    1现象给nginx配置负载均衡后,使用/usr/sbin/nginx启动nginx的话,负载均衡有效;但是给nginx配置好了开机启动后,重启机器,nginx正常启动,但是负载均衡不生效了。kill了nginx进程,再使用/usr/sbin/nginx重新启动nginx,负载均衡又有效了。(PS:本人nginx是centos7下yum安装的) 先查询状态sys......
  • Sql Server 创建用户并限制权限
    创建登录名使用sa或者Windows身份验证登录,【安全性】-【登录名】,右键【新建登录名】设置登录名属性设置数据库权限dbowner--拥有数据库全部权限,包括删除数据库权限dbaccessadmin--只给数据库用户创建其他数据库用户的权限,而没有创建登录用户的权限dbsec......
  • telegraf解析嵌套json遇到的问题
    问题描述kafka中的数据格式如下:{"customerId":1652,"deviceId":"13011304383","timestamp":1705637828000,"parameters":{"acc":0,"locationStatus":1,&......
  • angularjs1.x 性能优化笔记
    1.bind-html父级页面如果使用bind-html进行绑定子级组件例如:<divbind-html='vm.template1'><divbind-html='vm.template2'><divbind-html='vm.template3'>如果需要根据某个属性判断是否展示对应vm.template(子级组件)务必将ng-if放置到外部的div上,而不是内部的顶层div里面......