我用节点运行以下打字稿文件:
#!/usr/bin/env node
let Discord = require('discord.js');
let Hook = new Discord.WebhookClient('xxxxxxx', 'xxxxxxxx');
Hook.send("hello")
for (let i = 0; i < 1000000000; i++) {}
发送调用是异步的,但Hook实际上是在循环的最后一次迭代之后发送的。当我用fs.writeFile("result.txt", "Hey there!", function(err) {console.log("The file was saved!");});
我如何实现该功能被称为真正异步甚至同步。我只想在执行整个循环之前发送http请求。
答案 0 :(得分:1)
您可以使用Promises
,我们可以使用.then()
等待某事完成。这样我们就可以继续执行其他执行:
let Discord = require('discord.js'); let Hook = new
Discord.WebhookClient('xxxxxxx', 'xxxxxxxx');
Hook.send("hello").then(function(response) {
for (let i = 0; i < 1000000000; i++) {}
})
答案 1 :(得分:1)
Hook.send
将同步执行,但如果它与网络交互,那么它还将执行一些阻塞工作,这些工作将被添加到事件循环中。
只有在线程执行完同步代码后才会处理事件循环。这就是钩子在循环运行后实际发送的原因。
如果要延迟循环直到异步工作完成,那么您需要等待承诺(Hook.send
返回)才能解决。
当您使用TypeScript时,无论您使用的是哪个版本的Node,您都可以访问async/await
,因此可以重新构建代码。
async main() {
await Hook.send("hello");
// continue doing synchronous work
}
main().catch(err => throw err);
答案 2 :(得分:0)
如果您可以为操作设置回调函数,则可以嵌套回调。
E.g。
#!/usr/bin/env node
let Discord = require('discord.js');
let Hook = new Discord.WebhookClient('xxxxxxx', 'xxxxxxxx', function callback(err, res) {
console.log('File saved or async operation finishes here');
Hook.send("hello");
});
如您在问题中所提到的,您可以先使用fs.writeFile
尝试。这里的关键是在异步操作完成时调用名为callback
的传递的回调函数。然后在该函数内部调用Hook.send
,以保证在第一个函数完成后执行它。
一旦你开始这么做,你就会遇到一个叫做回调地狱的事情,你会遇到大量回调嵌套的情况。
您需要查看async module或JS Promises和Promise链接。