chatGPT에게 물어본




‘then()’ 메서드를 통해 Promise를 연결하면 이전 반환 값은 어디로 가나요?

then() 메서드를 통해 Promise를 연결하면 이전 then() 콜백 함수의 반환 값이 해결된 값으로 다음 then() 콜백 함수에 전달됩니다.

예를 들어 다음 코드를 고려하십시오.

자바스크립트코드 복사
끊임없는 약속 = 새로운 약속하다((해결하다, 거부하다) => { 결정하다(하나); }); 약속하다.그 다음에((숫자) => { 돌려 주다 숫자 + 하나; }).그 다음에((숫자) => { 콘솔.규약(숫자); });

이 예에서는 즉시 값 1로 확인되는 새 약속을 만듭니다. 그런 다음 두 개의 then() 메서드를 연결합니다. 첫 번째 then() 메서드에서는 해결된 값에 1을 더하고 결과를 반환합니다. 두 번째 then() 메서드에서는 확인된 값을 콘솔에 기록합니다.

then()의 첫 번째 콜백 함수가 실행되면 값 2를 반환합니다. 그런 다음 이 값은 콘솔에 값을 기록하는 then()의 두 번째 콜백 함수에 해결된 값으로 전달됩니다.

이 경우 첫 번째 then() 콜백 함수(2)의 반환 값은 두 번째 then() 콜백 함수에 이전 약속의 해결된 값으로 전달됩니다. 이것은 값이 하나의 then() 콜백 함수에서 약속 체인의 다음 함수로 전달되는 방식입니다.

그러나 나는 그것을 이해할 수 없다. ‘promise.then(~)’은 약속이라고 생각합니다. 어떻게 보이는지 보고 싶습니다(구현).

예, Promise.then()이 Promise를 반환한다는 것이 맞습니다. 다음은 작동 방식을 보여주는 then() 메서드의 구현 예입니다.

자바스크립트코드 복사
약속하다.원기.그 다음에 = 기능(onResolved, onRejected) { // 콜백 함수가 제공되지 않으면 해결된 값만 전달합니다. onResolved = onResolved || 기능() { 돌려 주다 값; }; // 새로운 Promise 객체를 반환할 수 있도록 현재 Promise 객체에 대한 참조를 저장합니다. 끊임없는 현재 약속 = 그만큼; // 이 함수가 반환할 새 Promise 객체를 생성합니다. 끊임없는 새로운 약속 = 새로운 약속하다((해결하다, 거부하다) => { // 현재 약속 개체로 콜백 함수를 등록합니다. 현재 약속._registerCallbacks((결과, isError) => { 시도 { // 해결된 값으로 then() 메서드에 제공된 콜백 함수를 호출합니다. 허용하다 콜백결과 = isError ? 거부됨(결과): onSolved(결과); // 콜백 함수가 Promise 객체를 반환하는 경우 새 Promise를 해결하기 전에 해결될 때까지 기다립니다. 만약에 (콜백결과 대신에 약속하다) { 콜백결과.그 다음에(해산하다, 거부하다); } 다른 { 결정하다(리콜 결과); } } 잡다 (잘못하다) { 거부하다(잘못하다); } }); }); 돌려 주다 새로운 약속; };

이 예제 구현에서는 Promise 프로토타입에 대한 then() 메서드를 정의합니다. then() 메서드에는 약속이 해결될 때 실행되는 콜백 함수인 onResolved와 약속이 거부될 때 실행되는 콜백 함수인 onRejected(두 인수 모두 선택 사항)의 두 가지 인수가 있습니다.

then() 메서드가 Promise 객체에서 호출되면 현재 Promise 객체(currentPromise)에 대한 참조를 저장하고 then() 메서드가 반환하는 새 Promise 객체(newPromise)를 생성합니다.

그런 다음 then() 메서드는 _registerCallbacks() 메서드를 사용하여 현재 Promise 객체에 콜백 함수를 등록합니다. 이 콜백 함수는 약속이 해결되거나 거부될 때 실행됩니다.

Promise가 해결되거나 거부되면 _registerCallbacks()에 전달된 콜백 함수가 실행됩니다. 그런 다음 이 함수는 then() 메서드에 제공된 onResolved 또는 onRejected 콜백 함수를 호출하여 해결된 값 또는 거부 이유를 인수로 전달합니다.

onResolved 또는 onRejected 콜백 함수가 Promise 객체를 반환하는 경우 then() 메서드는 새 Promise 객체(newPromise)를 확인하기 전에 해당 Promise 객체가 확인되기를 기다립니다. 콜백 함수가 비 약속 값을 반환하면 새 약속이 해당 값으로 즉시 해결됩니다.

이것이 JavaScript Promise에서 then() 메서드가 작동하는 방식을 설명하는 데 도움이 되기를 바랍니다.