等待会抛出错误的同步操作,会返回拒绝的期约:
```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