Promise를 사용하면 브라우저가 거부를 두 번 리턴하지만 해결을 두 번 리턴하지 않는 이유는 무엇입니까?


10

javaScript를 이해하는 데 문제가 promises있습니다. 다음 코드를 작성했습니다.

var p = new Promise(function(resolve,reject){

    reject(Error("hello world"));
});

setTimeout(()=>p.catch(e=>console.log(e)),5000);

Chrome 개발자 콘솔에서 바로 이것을 볼 수 있습니다. 여기에 이미지 설명을 입력하십시오

그러나 5 초 정도 기다린 후이 이미지와 같이 메시지가 자동으로 검은 색으로 바뀝니다. 여기에 이미지 설명을 입력하십시오

JavaScript 코드와 개발자 콘솔간에이 동작을 본 적이 없습니다. 여기서 JavaScript 코드가 개발자 콘솔에서 "기존 컨텐츠를 수정할 수 있습니다".

그래서이 resolve코드를 작성 하여 동일한 상황이 발생하는지 확인하기로 결정했습니다 .

var p = new Promise(function(resolve,reject){

    resolve("hello world");
});

setTimeout(()=>p.then(e=>console.log(e)),5000);

그러나이 상황에서 개발자 콘솔은 5 초 후에 아무것도 표시하지 않고 인쇄합니다 hello world.

resolvereject호출 시점 과 관련하여 왜 다르게 취급됩니까?


특별한

나는 또한이 코드를 썼다 :

var p = new Promise(function(resolve,reject){

    reject(Error("hello world"));
});

setTimeout(()=>p.catch(e=>console.log("errors",e)),5000);
setTimeout(()=>p.catch(e=>console.log("errors 2",e)),6000);
setTimeout(()=>p.catch(null),7000);

이로 인해 개발자 콘솔에 여러 출력이 발생합니다. 시간 0에 빨간색 오류가 발생하고 텍스트가 5 초에 빨간색으로 바뀌고 errors hello world6 초에 새 오류 메시지 가 나타난 후 errors 2 hello world7 초에 빨간색 오류 메시지가 나타납니다. 이제는 reject실제로 몇 번이나 호출 되는지에 대해 매우 혼란스러워합니다 .... 나는 길을 잃었습니다 ...


1
그냥 따로 : var p = new Promise(function(resolve,reject){ reject(Error("hello world")); });더 관용적이고 간결하게 다음과 같이 쓸 수 있습니다 var p = Promise.reject(Error("hello world"));:-)
TJ Crowder

1
멋진 질문입니다.
TJ Crowder

답변:


11

와우, 정말 멋지다. 나는 콘솔이 전에 그렇게하는 것을 보지 못했습니다. (그러나 다른 형태 의 역동적 인 행동이 있기 때문에 ...) 다음은 진행중인 일입니다.

첫 번째 경우, setTimeout콜백 코드 외부의 모든 코드 실행이 완료되고 실행 스택이 반환되어 사용자 플랫폼 JavaScript 코드 (현재로서는 약속 / A + 사양에서 호출 한대로) 만 " 플랫폼 코드 " 만 실행됩니다. 이 시점에서 약속은 거부되고 거부를 처리 한 것은 없으므로 처리되지 않은 거부 이므로 devtools는이를 귀하에게보고합니다.

그런 다음 5 초 후에 콜백이 실행되고 거부 처리기가 연결됩니다. 이 시점에서 거부는 더 이상 처리되지 않습니다. 분명히 Chrome / V8 / devtools 는 콘솔에서 처리되지 않은 거부 경고 를 제거 하기 위해 함께 작동합니다 . 대신에 나타나는 것은를 통해 거부 처리기에서 출력하는 것 console.log입니다. 거부 처리기를 더 빨리 연결하면 처리되지 않은 거부 오류가 발생하지 않습니다.

이행을 처리하지 않는 것은 오류 조건이 아니기 때문에 이행에서는 발생하지 않습니다. 거부를 처리하지 않습니다.


1
오, 말이 되네요 FireFox가 약간 다르게 처리하는 것을 보았습니다. 그러나 이제 더 이해가됩니다.
John

1
나는 대답에 똑같이 썼지 만 SO는 당신을로드 했으므로 내 글을 게시하지 않았습니다. 좋은 설명! +1
FZ
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.