0
点赞
收藏
分享

微信扫一扫

js await 的限制

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

```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();

```

举报

相关推荐

0 条评论