gpt4 book ai didi

javascript - 为什么 R.ifElse 不返回 Promise?

转载 作者:行者123 更新时间:2023-12-01 02:37:24 26 4
gpt4 key购买 nike

任务

我需要制作一个应用程序来读取 CSV 文件、转换其数据,然后将其输出为另一个 CSV 文件。

输入的格式如下:

13:25:37 up 19 days, 21:35,  4 users,  load average: 0.02, 0.02, 0.00
13:25:38 up 19 days, 21:35, 4 users, load average: 0.02, 0.02, 0.00
... so on

对于 UNIX 粉丝来说,您会认为这是控制台命令 uptime 的输出。

我想要的输出格式如下:

 RowNum, Avg Load
1,0.02
2,0.02

其中第一列是 CSV 中的行号,第二列是平均负载的数字部分:0.02。

所有其他列都将被忽略。

问题

为了尽我所能地做到这一点,我决定使用 ramda .

至少可以说,这是一个挑战。现在,我的代码有几个结构问题,但我想重点关注 main 函数,该函数不起作用。每次执行代码时都会出现错误:

index.js:54
.then( () => console.log("Done!") )
^

TypeError: main(...).then is not a function

这很令人困惑,因为在我传递给 R.ifElse 的两个函数中,我都返回了一个 Promise。

代码

const fs = require("fs");
const csvReader = require("csvreader");
const R = require("ramda");
const isString = require("lodash.isstring");
const { promisify } = require("util");
const argv = require("minimist")(process.argv.slice(2));
const appedFileAsync = promisify( fs.appendFile );

const createProcessData = () => {
const stringifyArray = array => `${array.toString()}\n`;
const write = str => fs.appendFileSync( argv.outputFile, str );

const getAvg = R.pipe(
R.replace("load average:", ""),
R.trim
);

let elapsedTime = 1;
const transform = list => [ elapsedTime++, getAvg ( R.nth( 3, list ) ) ];

return R.pipe(
transform,
stringifyArray,
write
);
};

const printHelp = () => {
console.log(`
=== MAN HELP ===
Usage: npm start -- --inputFile input.csv --outputFile output.csv
--inputFile: location of an input file in CSV format
--outputFile: location of an output file to append the new information to.
If this file does not exist, it will be created.
`);
return Promise.resolve();
};

const execute = () => appedFileAsync( argv.outputFile, "Time, Avg Load\n" )
.then( ( ) => csvReader.read( argv.inputFile, createProcessData() ) );

const main = () => {
const isInvalidFileName = R.anyPass( [ R.isNil, R.isEmpty, R.pipe ( isString, R.not ) ] );
const hasInvalidArgs = R.either( isInvalidFileName( argv.inputFile ), isInvalidFileName( argv.outputFile ) );

return R.ifElse(
hasInvalidArgs,
printHelp,
execute
);
};

main()
.then( () => console.log("Done!") )
.catch( console.error );

问题

  • 我的代码有什么问题?

最佳答案

这就是ifElse的思考方式:

const ifElse = (predicate, consequent, alternative) => 
(...val) => predicate(...val) ? consequent(...val) : alternative(...val);

所以

const comp = ifElse(
(a, b) => a < b,
(a, b) => `${a} is smaller than ${b}`,
(a, b) => `${a} is at least as large as ${b}`
)

comp(12, 7) //=> "12 is at least as large as 7"

要点是 ifElse 的第一个参数是一个函数。但是你将结果传递给它:

R.either( isInvalidFileName( argv.inputFile ), isInvalidFileName( argv.outputFile ) )

现在通常,either 返回一个函数。但这取决于您向它提供函数。假设是,如果您不提供函数,您知道自己在做什么,并且使用 apmap 方法提供容器类型,因此或者 稍微更通用一些。但是您提供的是 bool 值,例如 isInvalidFileName( argv.inputFile ) 的结果。那时的行为还没有明确定义。也许这一点应该改变,但 Ramda 的理念通常是垃圾进垃圾出。因此,无论出于何种原因,任一调用都会返回[undefined]

这意味着您将 [undefined] 作为谓词函数提供给 ifElse。当您尝试调用它时,您应该会收到错误。我没有尝试追查为什么该错误被您看到的错误所掩盖。

至于如何使用 Ramda 解决这个问题,我不太确定从哪里开始。这与 Ramda 一贯的风格相差甚远。如果不出意外的话,不接受参数的函数在 Ramda 中是极其罕见的。我想我会用一个接受 argv.inputFile 和 argv.outputFile 的函数来启动 Ramda 部分,无论是作为单独的对象还是作为单个对象 argv.

关于javascript - 为什么 R.ifElse 不返回 Promise?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47796874/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com