这是一个提供了异步遍历功能的工具,可以通过

async-each

这是一个提供了异步遍历功能的工具,可以通过插件拓展工具的遍历器。已经提供的方法包括forEach,every,some,filter,map,sort,reduce。

安装: npm install async-series-each --save-dev

提供的遍历器: forEach(callback[, thisArg])

调用方法及参数和同步版本forEach(Array.prototype.forEach)一致,功能也一致。

every(callback[, thisArg])

调用方法及参数和同步版本every(Array.prototype.every)一致,功能也一致。

some(callback[, thisArg])

调用方法及参数和同步版本some(Array.prototype.some)一致,功能也一致。

filter(callback[, thisArg])

调用方法及参数和同步版本filter(Array.prototype.filter)一致,功能也一致。

map(callback[, thisArg])

调用方法及参数和同步版本map(Array.prototype.map)一致,功能也一致。

reduce(callback[, fir])

调用方法及参数和同步版本reduce(Array.prototype.reduce)一致,功能也一致。

sort(callback)

调用方法及参数和同步版本sort(Array.prototype.sort)一致,功能也一致。内部采用的是插入排序,海量数据慎用。

你可以通过插件编写需要的遍历器 用法:

建议安装promise化工具: npm install new-promiseify --save-dev

调用环境应该是在async函数内部或者Promise实例的回调函数内部

//导入 const each = require('async-series-each'); const promiseify = require('new-promiseify'); const fs = require('fs'); //forEach await each([0, 0, 0, 0]).forEach(async(cur, i, ar) => { await promiseify([setTimeout, 0, 0])(5000); console.log(`Current index is ${i}`); }); //every const vaild = await each([1, 2, 3, 0, 4]).every(async(cur, i, ar) => { await promiseify([setTimeout, 0, 0])(5000); return console.log(cur) || cur; }); //some const vaild = await each([0, 0, 0, false, true, 1]).some(async(cur, i, ar) => { await promiseify([setTimeout, 0, 0])(5000); return console.log(cur) || cur; }); //filter const ar = await each([1, 2, 0, false, true, [], {}, null]).filter(async(cur, i, ar) => { await promiseify([setTimeout, 0, 0])(5000); return console.log(cur) || !cur; }); //map const ctns = await each(['./1.md', './2.md', './3.md']).map(async(cur, i, ar) => { const ctn = await promiseify(fs.readFile)(cur, 'utf8'); return console.log(cur) || ctn; }); //reduce const res = await each(['./1.md', './2.md', './3.md']).reduce(async(res, cur, i, ar) => { const ctn = await promiseify(fs.readFile)(cur, 'utf8'); return console.log(cur) || `${res + (i + 1)}. ${ctn}\n`; }, 'Read file content:\n'); //sort const ar = await each(['./1.md', './2.md', './3.md']).sort(async(prev, cur) => { const rdFile = promiseify(fs.readFile), firCtn = await rdFile(prev, 'utf8'), secCtn = await rdFile(cur, 'utf8'); return firCtn > secCtn ? 1 : -1; }); 一点说明

为什么不直接在Array.prototype上拓展? 因为我希望这个拓展是温和的,而不是具有侵入性的。

插件的写法

以some方法为例

module.exports = function SomeAsyncPlugin(Series) { //Regist some command to prototype of Series Series.prototype.some = async function(callback, cur = Series.root) { callback = callback.bind(cur); const src = this.source, len = src.length; for (let i = 0; i < len; i++) { const cont = await callback(src[i], i, src); if (cont) return true; } return false; }; };

版权声明:

1、该文章(资料)来源于互联网公开信息,我方只是对该内容做点评,所分享的下载地址为原作者公开地址。
2、网站不提供资料下载,如需下载请到原作者页面进行下载。