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.send
returns)来解决。
当您使用 TypeScript 时,无论您使用的是哪个版本的 Node,您都已经可以访问 async/await
,因此可以重构您的代码。
async main() {
await Hook.send("hello");
// continue doing synchronous work
}
main().catch(err => throw err);
我运行以下带有节点的打字稿文件:
#!/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 请求。
你可以使用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.send
returns)来解决。
当您使用 TypeScript 时,无论您使用的是哪个版本的 Node,您都已经可以访问 async/await
,因此可以重构您的代码。
async main() {
await Hook.send("hello");
// continue doing synchronous work
}
main().catch(err => throw err);