映射和 returns 已解决的承诺数组的函数的名称?
Name for a function that maps and returns a resolved array of promises?
也许这是一个愚蠢的问题,但我最近发现自己经常使用这种抽象:
async function giveMeAName(cbAsync, initValue) {
return await Promise.all(
initValue.map(cbAsync),
);
}
问题:这是其他人的共同任务吗?如果有,它有名字吗?如果没有,也许它只是部分意识到,那么它是否让你想起了什么?否则,我只能删除问题。
目前我正在为这组指令使用这个函数。下面的代码将获取路径的所有目录,并收集所有具有 package.json 的目录:
const directories = (await getDirNamesByPath(rootPath));
const paths = await giveMeAName(addExistAdaptor, directories.map(joinPathWithName(rootPath)));
return await giveMeAName(collectJson, paths.filter(hasPath));
我根据我在应用程序中的需要使用不同的名称。有时我会针对特定用例使用类似的函数并相应地命名。但我经常使用的最通用的名称只是 resolveAll()
。
但我不认为它有任何(半)官方命名。所以用对您来说最有意义的方式命名。
几天前你问了一个,我试着帮助你,但你从未回复:(
我已经回答了类似的问题 ( and here),概括了这种模式 -
const Parallel = p =>
( { map: async f =>
Promise .all ((await p) .map (x => f (x)))
, filter: async f =>
Promise .all ((await p) .filter (x => f (x)))
, flatMap: async f =>
Promise .all ((await p) .map (x => f (x))) .then (ys => [] .concat (...ys))
, // ...
}
)
您可以看到它以这种方式与 files
一起使用,它递归地列出目录及其子目录中所有文件的所有路径 -
const { readdir, stat } =
require ("fs") .promises
const { join } =
require ("path")
const files = async (path = ".") =>
(await stat (path)) .isDirectory ()
? Parallel (readdir (path))
.flatMap (f => files (join (path, f)))
: [ path ]
还有一个特化,search
,returns 所有匹配查询的路径 -
const { basename } =
require ("path")
const search = async (query, path = ".") =>
Parallel (files (path))
.filter (f => basename (f) === query)
和readPackages
递归读取指定路径下的所有package.json
文件-
const { readFile } =
require ("fs") .promises
const readPackages = async (path = ".") =>
Parallel (search ("package.json", path))
.map (readFile)
.then
( buffers =>
buffers .map (b => JSON .parse (String (b)))
)
最后,一个稍微复杂的示例,dirs
,它的工作方式类似于 files
,但仅递归地列出目录。递归的层次可以通过depth
参数-
来控制
const dirs = async (path = ".", depth = Infinity) =>
(await stat (path)) .isDirectory ()
? depth === -1
? []
: Parallel (readdir (path))
.flatMap (f => dirs (join (path, f), depth - 1))
.then (results => [ path, ...results ])
: []
要查看这些程序在 没有 Parallel
模块的情况下是什么样子,请参阅上面链接的问答。
也许 mapAll
或 awaitAll
?
Bluebird 有一个类似的函数,简称为 map()
,它做的事情非常相似(它 returns 映射承诺而不是解析它)。
也许这是一个愚蠢的问题,但我最近发现自己经常使用这种抽象:
async function giveMeAName(cbAsync, initValue) {
return await Promise.all(
initValue.map(cbAsync),
);
}
问题:这是其他人的共同任务吗?如果有,它有名字吗?如果没有,也许它只是部分意识到,那么它是否让你想起了什么?否则,我只能删除问题。
目前我正在为这组指令使用这个函数。下面的代码将获取路径的所有目录,并收集所有具有 package.json 的目录:
const directories = (await getDirNamesByPath(rootPath));
const paths = await giveMeAName(addExistAdaptor, directories.map(joinPathWithName(rootPath)));
return await giveMeAName(collectJson, paths.filter(hasPath));
我根据我在应用程序中的需要使用不同的名称。有时我会针对特定用例使用类似的函数并相应地命名。但我经常使用的最通用的名称只是 resolveAll()
。
但我不认为它有任何(半)官方命名。所以用对您来说最有意义的方式命名。
几天前你问了一个
我已经回答了类似的问题 (
const Parallel = p =>
( { map: async f =>
Promise .all ((await p) .map (x => f (x)))
, filter: async f =>
Promise .all ((await p) .filter (x => f (x)))
, flatMap: async f =>
Promise .all ((await p) .map (x => f (x))) .then (ys => [] .concat (...ys))
, // ...
}
)
您可以看到它以这种方式与 files
一起使用,它递归地列出目录及其子目录中所有文件的所有路径 -
const { readdir, stat } =
require ("fs") .promises
const { join } =
require ("path")
const files = async (path = ".") =>
(await stat (path)) .isDirectory ()
? Parallel (readdir (path))
.flatMap (f => files (join (path, f)))
: [ path ]
还有一个特化,search
,returns 所有匹配查询的路径 -
const { basename } =
require ("path")
const search = async (query, path = ".") =>
Parallel (files (path))
.filter (f => basename (f) === query)
和readPackages
递归读取指定路径下的所有package.json
文件-
const { readFile } =
require ("fs") .promises
const readPackages = async (path = ".") =>
Parallel (search ("package.json", path))
.map (readFile)
.then
( buffers =>
buffers .map (b => JSON .parse (String (b)))
)
最后,一个稍微复杂的示例,dirs
,它的工作方式类似于 files
,但仅递归地列出目录。递归的层次可以通过depth
参数-
const dirs = async (path = ".", depth = Infinity) =>
(await stat (path)) .isDirectory ()
? depth === -1
? []
: Parallel (readdir (path))
.flatMap (f => dirs (join (path, f), depth - 1))
.then (results => [ path, ...results ])
: []
要查看这些程序在 没有 Parallel
模块的情况下是什么样子,请参阅上面链接的问答。
也许 mapAll
或 awaitAll
?
Bluebird 有一个类似的函数,简称为 map()
,它做的事情非常相似(它 returns 映射承诺而不是解析它)。