2017-10-03 3 views
0

임 :NodeJS - 파일 쓰기/HTTP 요청 진정 노드 다음과 같은 타이프 스크립트 파일을 실행 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++) {} 

센드 호출이 비동기 그러나 후크 실제로 후 루프의 마지막 반복을 를 전송합니다. 이것은 http 코드를 fs.writeFile("result.txt", "Hey there!", function(err) {console.log("The file was saved!");});으로 바꿀 때도 마찬가지입니다.

어떻게하면이 기능을 진정으로 비동기식으로 또는 동 기적으로 호출 할 수 있습니까? 난 그냥 http 요청을 전체 루프의 실행 전에 보내 주시기 바랍니다.

+0

은 정말 비동기 - 자바 스크립트 [동시성 및 이벤트 루프 (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

@Chocolate - 약속이 여기에 적용되지 않는다고 생각하면 다소 오해됩니다. 이것들은'Hook.send()'가 있습니다. 그것은 당신의 코드가 어떻게 구조화되는지와 아무 관련이 없습니다. 약속은 비동기 작업의 완료 및 오류를 추적하고 여기에서 수행하려는 작업과 정확히 일치하는 다른 코드와 조화를 이루는 한 가지 방법입니다. 따라서 주석에서 수행 한 방식대로 처리하지 않으면 해당 작업의 유용성을 이해하지 못하게됩니다 그리고 그들이 어떻게 여기에 적용 할 것인가. – 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

예, 약속이 아닐 경우, 우리가 할 수 있도록해야합니다. 비동기로 만들어라. 나는'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"); 
}); 

당신은 t을 시도 할 수 있습니다 자신의 당신이 당신의 질문에서 언급 한 바와 같이 첫째 fs.writeFile와. 여기서 중요한 점은 비동기 작업이 끝나면 callback이라는 콜백 함수가 호출된다는 것입니다. Hook.send은 첫 번째 함수가 완료된 후에 실행되도록 보장하기 위해 해당 함수 내부에서 호출됩니다.

이 작업을 많이 시작하면 콜백 지옥 (callback hell)이라고하는 명령이 실행됩니다. 여기에는 많은 콜백이 중첩되어있는 경우가 있습니다.

async module 또는 JS 약속 및 약속 체인을 확인하십시오.