异步遍历器
一、概念
异步遍历器
是ES6的新语法,主要是为了解决异步任务的遍历问题。现在有下面的代码;
const arr = [
new Promise(resolve=>{
setTimeout(()=>{ console.log('1') },1000)
}),
Promise.resolve('2'),
Promise.reject('3')
]
// 现在需要遍历这个数组
arr.forEach(promise=>{
promise.then(res=>console.log(res),reason=>console.log(reason))
})
// 2,3,1
二、为什么?
最终的结果是先打印2 , 3 然后过一秒钟之后再打印的 1,也就是说,我们遍历的顺序因为异步的原因被打乱了。我们就是希望按照元素的顺序来进行获得相应的结果,怎么办?
const arr = [
new Promise(resolve=>{
setTimeout(()=>{ console.log('1') },1000)
}),
Promise.resolve('2'),
Promise.reject('3')
]
// 现在需要遍历这个数组
for await (const promise of arr) {
console.log(promise)
}
// 1,2,3
现在即便元素中有异步操作,但是依然可以按照同步的顺序进行遍历了,这样就达到了我们想要的结果。
补充:异步遍历器也可以在同步元素中使用!
(async function () {
for await (const x of ['a', 'b']) {
console.log(x);
}
})();
// a b
三、use in node !
实际上,在node.js中也部署了这个api,我们来看看在nodejs中的应用?
const fs = require('fs')
// 普通写法
const readFile = (path)=>{
const readStream = fs.createReadStream(path,{encoding: 'utf8'});
readSteam.on('data',chunk=>{
console.log('-->'+chunk)
});
readStream.on('end', () => {
console.log('### DONE ###');
});
}
// 使用for await
const readFile = (path)=>{
const readStream = fs.createReadStream(path,{encoding: 'utf8'});
for await(const chunk of readStream){
console.log('-->'+chunk)
}
readStream.on('end', () => {
console.log('### DONE ###');
});
}