JavaScript 약속 시작하기
비동기 코드 다음과 같은 작업을 수행하는 데 유용합니다. 시간이 많이 걸리는 그러나 물론, 그것은 죄책감이없는. 비동기 코드 사용 콜백 함수 그러나 콜백 함수를 사용하여 결과를 처리합니다. 값을 반환 할 수 없습니다. 전형적인 자바 스크립트 함수는.
따라서, 그들은 우리의 능력을 함수의 실행 뿐만 아니라 오류 처리 격렬한 번거 로움. 이것은 약속
목적 그 중 일부를 채우기 위해 비동기 코딩의 움푹 들어간 곳.
약속
기술적으로 표준 내부 객체 자바 스크립트에서는 의미가옵니다. JavaScript에 내장. 그것은 비동기 코드 블록의 최종 결과 (또는 코드가 실패한 이유)를 제어하고 비동기 코드 실행.
통사론
우리는 의 예 약속
목적 ~을 사용하여 새로운
예어:
새로운 약속 (기능 (해결, 거부) );
함수 매개 변수로 전달됨 ~로 약속()
생성자는 집행자. 비동기 코드와 의 두 가지 매개 변수가 있습니다. 기능
유형, 로 지칭 결의
과 받지 않다
함수 (이것들에 관해서는 곧 다름).
의 상태 약속
목적
그만큼 초기 상태 ~의 약속
객체가 호출 됨 계류중인. 이 상태에서 비동기 계산의 결과 존재하지 않는다.
초기 보류 상태가로 변경됩니다. 성취 된 계산이있을 때 상태 성공한. 그만큼 계산 결과 이 상태에서 사용할 수 있습니다..
비동기 계산의 경우 실패하다, 그만큼 약속
물체가 거부 된 처음부터 상태 계류중인 상태. 이 상태에서 계산 실패의 이유 (즉, 오류 메시지)가 사용 가능하게됩니다..
에서 이동하려면 계류중인 에 성취 된 상태, 결의()
라는. 에서 이동하려면 계류중인 에 거부 된 상태, 받지 않다()
라는.
그만큼 그때
과 잡기
행동 양식
상태 변경 사항 계류중인 에 성취 된, 의 이벤트 핸들러 약속
사물 그때
방법 실행됩니다. 그리고, 국가 변경 사항 계류중인 에 거부 된, 의 이벤트 핸들러 약속
사물 잡기
방법 실행 됨.
예제 1
“약속 안함” 암호
거기에 hello.txt
파일을 포함하는 “여보세요” 워드. AJAX 요청을 작성하는 방법은 다음과 같습니다. 그 파일을 가져오다. 과 그 내용을 보여라., 사용하지 않고 약속
목적:
함수 getTxt () let xhr = new XMLHttpRequest (); xhr.open ( 'GET', 'hello.txt'); xhr.overrideMimeType ( 'text / plain'); xhr.send (); xhr.onload = function () try switch (this.status) case 200 : document.write (this.response); 단절; case 404 : '파일을 찾을 수 없음'; 기본값 : '파일을 가져 오지 못했습니다.'; catch (오류) console.log (오류); getTxt ();
파일의 내용이 성공적으로 가져온, 즉. 응답 상태 코드는 200입니다., 응답 텍스트는 문서에 쓴. 파일이 찾을 수 없음 (상태 404), 에이 “파일을 찾을 수 없음” 오류 메시지가 발생합니다. 그렇지 않으면, a 일반적인 오류 메시지 파일을 가져 오는 데 실패했음을 나타냅니다..
“약속 됨” 암호
이제하자. 위의 코드를 알리십시오:
xhr = new XMLHttpRequest (); xhr.open ( 'GET', 'hello.txt'); xhr.overrideMimeType ( 'text / plain'); case 404 : 거부 ( '파일을 찾을 수 없음'), 기본값 : 거부 ( '실패 ('실패) ','취소 ' 파일 가져 오기 ');;); catch (function (err) console.log (err);); getTxt ().
그만큼 getTxt ()
함수가 다음으로 코딩되었습니다. 새 인스턴스를 반환하십시오. 약속
목적, 실행자 함수는 비동기 코드를 이전부터 보유하고 있습니다..
때 응답 상태 코드는 200입니다., 그만큼 약속
~이다. 성취 된 으로 부름 결의()
(응답은의 매개 변수로 전달됩니다. 결의()
). 상태 코드가 404이거나 다른 경우, 약속
~이다. 거부 된 ~을 사용하여 받지 않다()
(적절한 오류 메시지를 매개 변수로 사용) 받지 않다()
).
그만큼 이벤트 핸들러 그때()
과 잡기()
행동 양식 ~의 약속
물건이있다 끝에 추가.
때 약속
~이다. 성취 된, 그 핸들러 그때()
메서드가 실행됩니다. 그 논쟁은 에서 전달 된 매개 변수 결의()
. 이벤트 처리기 내에서 응답 텍스트 (인수로 수신 됨)는 다음과 같습니다. 문서에 쓴.
때 약속
~이다. 거부 된, 의 이벤트 핸들러 잡기()
메소드가 실행 중이다., 오류 로깅.
그만큼 주요 이점 위의 코드의 Promisified 버전은 오류 처리. Non-Promisified 버전과 같이 Uncaught 예외를 던지기보다는 적절한 실패 메시지 반환 및 기록.
하지만, 그것은 단지 돌아 오는 ~의 실패 메시지 뿐만 아니라 비동기 계산의 결과 그것은 우리에게 정말로 유리할 수 있습니다. 이를 확인하려면 예제를 확장해야합니다..
예제 2
“약속 안함” 암호
텍스트를 표시하는 대신 hello.txt
, 나는 싶다. 그것을 “세계” 워드 그것을 화면에 표시하십시오. 시간 초과 2 초 후. 다음은 내가 사용하는 코드입니다.
함수 getTxt () let xhr = new XMLHttpRequest (); xhr.open ( 'GET', 'hello.txt'); xhr.overrideMimeType ( 'text / plain'); xhr.send (); xhr.onload = function () try switch (this.status) case 200 : document.write (concatTxt (this.response)); 단절; case 404 : '파일을 찾을 수 없음'; 기본값 : '파일을 가져 오지 못했습니다.'; catch (오류) console.log (오류); 함수 concatTxt (res) setTimeout (function () return (res + 'World'), 2000); getTxt ();
상태 코드 200에서 concatTxt ()
함수가 호출되었습니다. 응답 텍스트를 “세계” 워드 문서에 쓰기 전에.
그러나이 코드 원하는대로 작동하지 않습니다.. 그만큼 setTimeout ()
콜백 함수 연결된 문자열을 반환 할 수 없습니다.. 문서에 인쇄 될 내용은 다음과 같습니다. 정의되지 않은
왜냐하면 뭐 concatTxt ()
보고.
“약속 됨” 암호
코드가 작동하도록하려면 위의 코드를 알리십시오, 포함 concatTxt ()
:
xhr = new XMLHttpRequest (); xhr.open ( 'GET', 'hello.txt'); xhr.overrideMimeType ( 'text / plain'); case 404 : 거부 ( '파일을 찾을 수 없음'), 기본값 : 거부 ( '실패 ('실패) ','취소 ' 파일 가져 오기 ');;); 함수 concatTxt (txt) 새 약속을 반환합니다 (함수 (해결, 거부) setTimeout (함수 () 해결 (txt + '세계'););); () = console getTxt () 다음에 ((txt) => return concatTxt (txt);) 다음에 ((txt) => document.write (txt);) catch ((err) => console. log (err););
처럼 getTxt ()
, 그만큼 concatTxt ()
또한 기능하다 새로운 것을 돌려 준다. 약속
목적 연결된 텍스트 대신 그만큼 약속
에 의해 반환 된 concatTxt ()
~이다. 내부 콜백 함수를 해결 함 setTimeout ()
.
위의 코드가 끝나면 첫 번째 이벤트 핸들러가 그때()
메소드는 약속
의 getTxt ()
~이다. 성취 된, 즉 파일이 성공적으로 가져왔다.. 핸들러 내부, concatTxt ()
라는 그리고 약속
에 의해 반환 된 concatTxt ()
반환됩니다..
두 번째 이벤트 핸들러 그때()
메소드는 약속
에 의해 반환 된 concatTxt ()
~이다. 성취 된, 즉 2 초 타임 아웃이 끝났습니다. 과 결의()
라는 연결된 문자열을 매개 변수로 사용하여.
마침내, 잡기()
모든 예외와 실패 메시지를 잡는다. 두 약속에서.
이 Promisified 버전에서는 “안녕하세요 세계” 문자열은 성공적으로 인쇄 문서에.