2017-10-03 9 views
0

イム:NodeJS - ノードでは、次の写し(typescript)ファイルを実行ファイル書き込み/ HTTP要求を真に非同期

#!/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++) {} 

送信呼び出しが非同期である、しかし、フックは、実際に後、ループの最後の繰り返しをを送っています。これは、私がhttpコードをfs.writeFile("result.txt", "Hey there!", function(err) {console.log("The file was saved!");});に置き換えたときと同じです。

本当に非同期的に、あるいは同期的に呼び出すことができます。私は、ループ全体の実行前にhttpリクエストを送信したいだけです。

+0

それは本当に非同期です - あなたのコードのように振る舞う理由を理解するためにはJavaScript [同時実行性とイベントループ](https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop)について読みます –

答えて

1

Hook.sendは、同期して実行されますが、ネットワークとやり取りする場合は、イベントループに追加されるいくつかのブロック作業も実行します。

イベントループは、スレッドが同期コードの実行を終了した後にのみ処理されます。これは、ループが実行された後にフックが実際に送信する理由です。

非同期作業が終了するまでループを延期する場合は、約束(そのHook.sendが返す)を解決するまで待つ必要があります。

TypeScriptを使用しているので、使用しているノードのバージョンに関係なく、すでにasync/awaitにアクセスしているので、コードを再構成することができます。

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

    // continue doing synchronous work 
} 

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

これは実際の問題を解決していただきありがとうございます。私のコードはイベントに基づいていないので、約束は適切ではありませんでした。 – Chocolate

+1

@チョコレート - ここでは約束が適用されないと思うと、あなたは少し間違っています。これらは、 'Hook。send() 'はです。あなたのコードがどのように構造化されているかとは何の関係もありません。プロミスは、非同期オペレーションの完了とエラーを追跡し、ここでやろうとしているものと他のコードを調整する方法の1つです。あなたのコメントのようにそれらを却下すれば、その有用性を理解できないことが明らかです彼らがここでどのように適用されるのかを示します。 – jfriend00

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++) {} 
}) 
+0

これは** 'Hook.send'がPromiseを返すと仮定していませんか? –

+1

https://discord.js.org/#/docs/main/stable/class/WebhookClient?scrollTo=send – cyrix

+0

はい、それがPromiseでない場合は、私たちができるようにする必要がありますこれを非同期にします。 「Discord .WebhookClient」はすでに約束していたと私は考えていた。それはありませんでしたか?その場合は –

0

操作にコールバック関数を使用できる場合は、コールバックをネストすることができます。

など。

#!/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 and Promiseチェインをチェックしてください。

関連する問題