대안
이에 대한 대안 :
async function main() {
try {
var quote = await getQuote();
console.log(quote);
} catch (error) {
console.error(error);
}
}
약속을 명시 적으로 사용하면 다음과 같습니다.
function main() {
getQuote().then((quote) => {
console.log(quote);
}).catch((error) => {
console.error(error);
});
}
또는 다음과 같이 연속 전달 스타일을 사용합니다.
function main() {
getQuote((error, quote) => {
if (error) {
console.error(error);
} else {
console.log(quote);
}
});
}
원래 예
원래 코드가하는 일은 실행을 일시 중단하고에서 반환 된 약속 getQuote()
이 해결 될 때까지 기다리는 것입니다 . 그런 다음 실행을 계속하고 반환 된 값을 var quote
기록한 다음 약속이 해결 된 경우이를 인쇄하거나 예외를 throw하고 약속이 거부 된 경우 오류를 인쇄하는 catch 블록을 실행합니다.
두 번째 예제와 같이 Promise API를 사용하여 동일한 작업을 직접 수행 할 수 있습니다.
공연
이제 성능을 위해. 테스트 해 봅시다!
난 그냥이 코드를 작성 - f1()
제공 1
, 반환 값으로 f2()
던져 1
예외로 :
function f1() {
return 1;
}
function f2() {
throw 1;
}
이제 동일한 코드를 백만 번 호출 해 보겠습니다 f1()
.
var sum = 0;
for (var i = 0; i < 1e6; i++) {
try {
sum += f1();
} catch (e) {
sum += e;
}
}
console.log(sum);
그리고 다음의 변화하자 f1()
에를 f2()
:
var sum = 0;
for (var i = 0; i < 1e6; i++) {
try {
sum += f2();
} catch (e) {
sum += e;
}
}
console.log(sum);
이것은 내가 얻은 결과입니다 f1
.
$ time node throw-test.js
1000000
real 0m0.073s
user 0m0.070s
sys 0m0.004s
이것이 내가 얻은 것입니다 f2
.
$ time node throw-test.js
1000000
real 0m0.632s
user 0m0.629s
sys 0m0.004s
하나의 단일 스레드 프로세스에서 초당 2 백만 번의 작업을 수행 할 수있는 것 같습니다. 그 이상을하고 있다면 그것에 대해 걱정해야 할 수도 있습니다.
요약
Node.js에서는 그런 것에 대해 걱정하지 않습니다. 그런 것들이 많이 사용되면 결국 V8이나 SpiderMonkey 또는 Chakra 팀에 의해 최적화되고 모든 사람들이 따를 것입니다. 원칙적으로 최적화되지 않은 것 같지 않습니다. 문제가 아닙니다.
최적화되지 않은 경우에도 Node에서 CPU를 최대로 사용한다면 C로 숫자 크 런칭을 작성해야한다고 주장합니다. 그것이 기본 애드온의 목적입니다. 또는 node.native 와 같은 것이 Node.js보다 작업에 더 적합 할 수 있습니다.
너무 많은 예외를 던질 필요가있는 사용 사례가 무엇인지 궁금합니다. 일반적으로 값을 반환하는 대신 예외를 던지는 것은 예외입니다.