Node.js中异步迭代器怎么使用
这篇文章主要介绍了Node.js中异步迭代器怎么使用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。
什么是异步迭代器
异步迭代器实际上是以前迭代器的异步版本。当我们不知道迭代的值和最终状态时,可以使用异步迭代器。两者不同的地方在于,我们得到的 promise 最终将被分解为普通的 { value: any, done: boolean }
对象,另外可以通过 for-await-of
循环来处理异步迭代器。就像 for-of
循环用于同步迭代器一样。
constasyncIterable=[1,2,3]; asyncIterable[Symbol.asyncIterator]=asyncfunction*(){ for(leti=0;i<asyncIterable.length;i++){ yield{value:asyncIterable[i],done:false} } yield{done:true}; }; (asyncfunction(){ forawait(constpartofasyncIterable){ console.log(part); } })();
与通常的 for-of
循环相反,`for-await-of
循环将会等待它收到的每个 promise 解析之后再继续执行下一个。
除了流之外,还在还没有什么能够支持异步迭代的结构,但是可以将 asyncIterator
符号手动添加到任何一种可迭代的结构中。
在流上使用异步迭代器
异步迭代器在处理流时非常有用。可读流、可写流、双工流和转换流上都带有 asyncIterator
符号。
asyncfunctionprintFileToConsole(path){ try{ constreadStream=fs.createReadStream(path,{encoding:'utf-8'}); forawait(constchunkofreadStream){ console.log(chunk); } console.log('EOF'); }catch(error){ console.log(error); } }
如果以这种方式写代码,就不需要在通过迭代获取每个数据块时监听 end
和 data
事件了,并且 for-await-of
循环会随着流的结束而结束。
用于有分页功能的 API
你还可以通过异步迭代从使用分页的源中轻松获取数据。为了实现这个功能,还需要一种从Node https 请求方法提供给的流中重构响应主体的方法。在这里也可以使用异步迭代器,因为 https 请求和响应在 Node 中都是流:
consthttps=require('https'); functionhomebrewFetch(url){ returnnewPromise(async(resolve,reject)=>{ constreq=https.get(url,asyncfunction(res){ if(res.statusCode>=400){ returnreject(newError(`HTTPStatus:${res.statusCode}`)); } try{ letbody=''; /* 代替res.on侦听流中的数据, 可以使用for-await-of, 并把数据块附加到到响应体的剩余部分 */ forawait(constchunkofres){ body+=chunk; } //处理响应没有响应体的情况 if(!body)resolve({}); //需要解析正文来获取json,因为它是一个字符串 constresult=JSON.parse(body); resolve(result); }catch(error){ reject(error) } }); awaitreq; req.end(); }); }
代码通过向 Cat API(https://thecatapi.com/)发出请求,来获取一些猫的图片。另外还添加了 7 秒钟的延迟防止对 cat API 的访问过与频繁,因为那样是极其不道德的。
functionfetchCatPics({limit,page,done}){ returnhomebrewFetch(`https://api.thecatapi.com/v1/images/search?limit=${limit}&page=${page}&order=DESC`) .then(body=>({value:body,done})); } functioncatPics({limit}){ return{ [Symbol.asyncIterator]:asyncfunction*(){ letcurrentPage=0; //5页后停止 while(currentPage<5){ try{ constcats=awaitfetchCatPics({currentPage,limit,done:false}); console.log(`Fetched${limit}cats`); yieldcats; currentPage++; }catch(error){ console.log('Therehasbeenanerrorfetchingallthecats!'); console.log(error); } } } }; } (asyncfunction(){ try{ forawait(letcatPicPageofcatPics({limit:10})){ console.log(catPicPage); //每次请求之间等待7秒 awaitnewPromise(resolve=>setTimeout(resolve,7000)); } }catch(error){ console.log(error); } })()
这样,我们就会每隔7秒钟自动取回一整页的喵星人图片。
一种更常见的页面间导航的方法可实现 next
和 previous
方法并将它们公开为控件:
functionactualCatPics({limit}){ return{ [Symbol.asyncIterator]:()=>{ letpage=0; return{ next:function(){ page++; returnfetchCatPics({page,limit,done:false}); }, previous:function(){ if(page>0){ page--; returnfetchCatPics({page,limit,done:false}); } returnfetchCatPics({page:0,limit,done:true}); } } } }; } try{ constsomeCatPics=actualCatPics({limit:5}); const{next,previous}=someCatPics[Symbol.asyncIterator](); next().then(console.log); next().then(console.log); previous().then(console.log); }catch(error){ console.log(error); }
如你所见,当要获取数据页面或在程序的 UI 上进行无限滚动之类的操作时,异步迭代器会非常有用。
这些功能在 Chrome 63+、Firefox 57+、Safari 11.1+ 中可用。
你还能想到可以把异步迭代器用在什么地方吗?欢迎在下面留言!
感谢你能够认真阅读完这篇文章,希望小编分享的“Node.js中异步迭代器怎么使用”这篇文章对大家有帮助,同时也希望大家多多支持恰卡编程网,关注恰卡编程网行业资讯频道,更多相关知识等着你来学习!
推荐阅读
-
node.js中Buffer对象有什么用
-
Node.js实现断点续传
Node.js实现断点续传目录方案分析切片断点续传具体解决流程逻辑分析前端服务端小结方案分析切片就是对上...
-
使用Node.js怎么实现一个HTTP服务器
这篇文章将为大家详细讲解有关使用Node.js怎么实现一个HTTP服务器,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅...
-
使用Node.js怎么实现一个大文件分片上传功能
使用Node.js怎么实现一个大文件分片上传功能?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这...
-
jade模板引擎如何在Node.js中使用
-
如何在Node.js中引入UIBootstrap
-
Angular如何在Node.js中使用
-
AngularJS怎么在Node.js中使用
-
使用node.js如何连接mysql
使用node.js如何连接mysql?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人...
-
body-parser怎么在node.js中使用
本篇文章为大家展示了body-parser怎么在node.js中使用,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的...