NodeJS - 文件 Write/Http 请求真正异步

NodeJS - File Write/Http request truly asychronous

我运行以下带有节点的打字稿文件:

#!/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 代码时,这是一样的

如何实现真正异步甚至同步调用该函数。我只想在整个循环执行之前发送 http 请求。

你可以使用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++) {}
})

如果你的操作可以有回调函数,你可以嵌套回调。

例如

#!/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 chaining。

Hook.send会同步执行,但如果它与网络交互,那么它也会执行一些阻塞工作,这些工作将被添加到事件循环中。

只有在线程执行完同步代码后才会处理事件循环。这就是为什么在循环有 运行.

之后钩子实际上发送的原因

如果你想延迟循环直到异步工作完成,那么你需要等待承诺(Hook.sendreturns)来解决。

当您使用 TypeScript 时,无论您使用的是哪个版本的 Node,您都已经可以访问 async/await,因此可以重构您的代码。

async main() {
  await Hook.send("hello");

  // continue doing synchronous work
}

main().catch(err => throw err);