node.js - 如何在事件中使用 NodeJs 中的 readline(等待流关闭)
问题描述
我正在创建一个机器人,当它收到消息时开始读取文本文件并使用文件内容响应消息。
不幸的是,我无法摆脱这个异步地狱,我只会得到错误、未定义或承诺
最后一个实验是这样的:
const fs = require('fs');
const readline = require('readline');
// bot.listen("message").reply(responseText())
function readFile(file) {
var text = '';
var readInterface = readline.createInterface({
input: fs.createReadStream(file),
terminal: false
});
readInterface.on('line', function(line) {
linea = line.trim();
console.log(linea);
text += linea;
}).on('close', function() {
return text;
});
});
}
async function responseText() {
var content = await readFile("file.txt");
content.then(function(data) {
return data;
})
}
我想得到的是延迟响应,直到我得到文件的内容。我知道该节点是基于异步的,但我不知道如何处理它!
谢谢大家
解决方案
如果你想使用async-await
需要创建一个promise并返回它。
function readFile(file) {
return new Promise((res, rej) => {
try {
var text = '';
var readInterface = readline.createInterface({
input: fs.createReadStream(file),
terminal: false
});
readInterface
.on('line', function (line) {
linea = line.trim();
text += linea;
})
.on('close', function () {
res(text);
});
} catch(err){
rej(err)
}
});
}
推荐阅读
- html - 在其中一个伸缩项目中的内容之前使用css后如何垂直对齐伸缩项目
- c# - 如何使用 MVVM 调整放置在容器中的用户控件集合的大小(开发垂直比例)
- python - 返回一个整数,其第一行索引包含特定列中的字符串
- python - 在单元测试中保存(打印)输出,但禁止控制台输出
- docker - 在 Gitlab CI 中构建多个 docker 镜像
- angular - Ng 引导单选按钮
- intellij-idea - 强制 IntelliJ 激活 SQL 智能
- apache - 在反向代理后面对 arangodb 进行身份验证,这也需要基本身份验证
- java - 使用 windows 从无限 DataStream 中过滤重复项
- java - 从未使用私有字段“serialVersionUID”:intelliJ