NodeJS - 文件写/ Http请求真正不同步

时间:2017-10-03 23:03:55

标签: javascript node.js typescript asynchronous synchronous

我用节点运行以下打字稿文件:

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

3 个答案:

答案 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链接。