【发布时间】:2019-09-19 14:44:42
【问题描述】:
我有一个名为 translateCommand(command) 的函数,它使用来自 npm 的 Translate 包将一些文本翻译成不同的语言。问题是该包提供的translate函数是异步的,往往在translate函数完成之前就退出translateCommand函数,导致返回垃圾数据。
我发现它完成太快是问题,并将 translateCommand(command) 设为异步函数,这样我就可以在导入的 translate() 函数前面使用 await,这解决了该问题,但现在我只是延迟了这个问题更进一步,因为调用 translateCommand(command) 的函数遇到了完全相同的问题,如果我只需要继续向上重复这个链,我觉得我没有取得任何进展。
事实上,我并不真正了解 Promise 以及 Async 函数在一般情况下与它们相关的行为方式。我意识到这是让 Node.js 变得伟大的前提,但试图了解它却是相当无效的。试图解决这个问题并没有真正取得成果,因为每个人都只是说使用回调而没有解释回调到底是什么。这些示例通常被不熟悉的代码包围并没有帮助,所以我认为在我的代码上下文中获得帮助将用一块石头解决两只鸟。
这整个过程是我制作一个愚蠢的 Discord Bot 的初步尝试,我在其中实现了一堆愚蠢的功能。我已经多次遇到异步墙,但通常会找到一个同步的替代方案来继续前进。这次我没有,我尝试模拟其他 Stack Overflow 帖子中描述的回调,但由于缺乏理解,无法正确集成它们(我只能假设)。
现在存在异步问题的顶级导入函数。
client.on("message", (message) => {
// ...
let command = (message.content).substr(1);
// ...
// Handles translate command
else if (command.startsWith("translate"))
message.channel.send(translateCommand(command));
// ...
}
});
异步的函数,因此它可以等待:
// Form !translate [string]
async function translateCommand(command) {
let message = "";
let str = command.substr(10);
await translate(str, { to: 'ja', engine: 'yandex', key: '<my key>' }).then(function(result) {
message = result;
return "";
});
return message;
}
我知道这个问题已经被问死了,但我觉得没有我理解的上下文(因为我对 JS 和 Node 都还是新手),我只能继续用头撞墙,直到出现问题在我不明白为什么的情况下工作。
【问题讨论】:
-
async (message) => {和message.channel.send(await translateCommand(command));
标签: javascript node.js async-await discord.js async.js