# ES9
# 前言
该篇文章主要是介绍了ES9新加的一些特性。
# 1. 异步迭代
在async/await的某些时刻,你可能尝试在同步循环中调用异步函数。例如:
async function process(array) {
for (let i of array) {
await doSomething(i);
}
}
复制代码
@前端进阶之旅: 代码已经复制到剪贴板
这段代码不会正常运行,下面这段同样也不会:
async function process(array) {
array.forEach(async i => {
await doSomething(i);
});
}
复制代码
@前端进阶之旅: 代码已经复制到剪贴板
这段代码中,循环本身依旧保持同步,并在在内部异步函数之前全部调用完成。
ES2018引入异步迭代器(asynchronous iterators),这就像常规迭代器,除了next()方法返回一个Promise。因此await可以和for...of循环一起使用,以串行的方式运行异步操作。例如:
async function process(array) {
for await (let i of array) {
doSomething(i);
}
}
@前端进阶之旅: 代码已经复制到剪贴板
# 2. Promise.finally()
在ES6中,一个Promise链要么成功进入最后一个then()要么失败触发catch()。而实际中,我们可能需要无论Promise无论成功还是失败,都运行相同的代码。例如清除,删除回话,关闭数据库连接等操作。
ES9中,允许使用finally()来指定最终的逻辑。
如下:
let count = () => {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(100)
}, 1000);
})
}
let list = () => {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve([1, 2, 3])
}, 1000);
})
}
let getList = async () => {
let c = await count()
console.log('async')
let l = await list()
return { count: c, list: l }
}
console.time('start');
getList().then(res => {
console.log(res)
})
.catch(err => {
console.timeEnd('start')
console.log(err)
})
.finally(() => {
console.log('finally')
})
//执行结果
async
{count: 100, list: [1, 2, 3]}
finally
@前端进阶之旅: 代码已经复制到剪贴板
# 3. Rest/Spread 属性
# 3.1 ES6中(…)
在ES6中引入了三点...,作用主要是Rest参数和扩展运算符:
作用对象仅用于数组
1.将一个未知数量的参数表示一个数组:
