假设我有以下输入(与
Node一起使用,但问题更普遍,与节点无关):
dirPathAbsnamesSeq)例如:
我可能有namesSeq = ['a', 'b', 'c'],它对应于a.js,b.js,c.js在dirPathAbs里面。
问题:
我如何解析文件的路径,以纯函数方式,也以协变方式?(也就是说,不必谈论迭代数组的变量。协变可能不是这个词的意思,对不起)。
我不想要的:
namesSeq.map(base => path.join(dirPathAbs, `${base}.js`));Nor
namesSeq.map(base => require.resolve(path.join(dirPathAbs, base))); Nor
namesSeq.map(base => path.resolve.bind(dirPathAbs)(base));Nor
const cb = base => path.resolve.bind(dirPathAbs)(base);
namesSeq.map(cb);我还以为这个能起作用
namesSeq.map(path.resolve.bind(dirPathAbs))但是没有。我认为path.resolve.bind(dirPathAbs)接收输入namesSeq,这是提供给Array.prototype.map的回调的第三个参数,因为我看到的错误是
TypeError: Path must be a string. Received [ 'a', 'b', 'c' ]这只是一种让我感到沮丧的运动,但是自从学习JS以来,一系列类似的练习让我头疼。谈到this如何绑定,以及应该如何使用这些Function.prototype、Array.prototype和朋友,我仍然缺少一些东西。
发布于 2019-01-05 23:24:27
您可以在中间添加另一个函数来消耗这些额外的变量:
const take = (fn, n) => (...args) => fn(...args.slice(0, n));
const bind = fn => (...args) => (...args2) => fn(...args, ...args2);
namesSeq.map(take(bind(path.resolve)(dirPathAbs), 1));但我没有看到任何关于命名参数的进展。
发布于 2019-01-06 00:15:37
我认为可能有一个关于namesSeq的假设,这在一定程度上是错误的。这里有一个非常简单的例子,它或多或少地跟随着你正在做的事情。当您运行代码段时,您可以看到它按预期工作:
function mockResolve(input) {
console.log(input)
return input * 2;
}
var scopeObject = {
sequence: [1, 2, 3]
};
var accessSequence = scopeObject.sequence;
var mapping = accessSequence.map(mockResolve.bind(scopeObject));
console.log(mapping);
namesSeq仅仅是一个包含这些文件字符串的数组吗?在不确定的情况下,我猜测它可能是一个包含文件名字符串数组的数组,因此,当它期望一个字符串时,就会出现字符串数组的错误。
https://stackoverflow.com/questions/54057185
复制相似问题