1.자바스크립트는 싱글-스레드로 디자인됬다. 즉, 자바스크립트 코드의 병렬 처리가 자바스크립트 엔진 내에서는 일어날 수 가 없다. 즉. 아래 코드는 Promise를 쓰는 게 성능에 악영향을 준다.

var a = 0;
var countA= 100;

console.time('benchmarkA');
while(countA--) {
new Promise( (resolve) => {
resolve(a += 1);
}).then( () => {});
}
console.timeEnd('benchmarkA'); //benchmarkA: 0.234ms

var b = 0;
var countB = 100;

console.time('benchmarkB');
while(countB--) {
b += 1;
}
console.timeEnd('benchmarkB'); //benchmarkB: 0.013ms

2.Promise는 연산을 병렬로 돌리는 게 아닌, 연산의 결과가 당장 필요하지 않을 때. 그 연산 결과의 처리를 미루는 것이다. 그래서 위와 같은 코드를 돌렸을 떄. 그냥 엔진이 최적화하기 쉬운 코드보다 성능을 더 먹는다.


3.Promise의 executor은 Promise생성자가 객체를 반환하기도 전에 호출되며. settled 될 때 까지 다른 코드가 돌아가다 settled 되면 마이크로 태스크 큐에 핸들러가 올라가고, 콜 스택이 비면.큐에서 빠져나와 처리가 되는 것이다. 즉, executor은 현재 태스크에서 실행된다는 말이다.

var p1 = new Promise( (resolve) =>{
console.log(1);
while(true);
});
console.log(2);

그래서 위 코드에서 2는 영영 출력되지 않는다.


이 정도만 알아도 Promise 쓰다 조질 일은 없다. 아, 물론 여러분이 Promise 안티 패턴에 대해 기본적으로 알고 있다는 가정 하에 말이다.