머리말
약속 객체는 수행 할 작업으로 이해 될 수 있습니다 (종종 비동기 작업에 사용). Promise Object를 사용한 후 코드는 체인 호출 방식으로 구성하여 코드를보다 직관적으로 만들 수 있습니다. 또한, 그러한 방법이 약속과 같은 방법의 존재이기 때문에, 동시에 여러 작업을 수행하는 것이 간단하게 만들어 질 수 있습니다.
약속의 상승은 비동기 메소드 호출에서 콜백 함수가 종종 발생하기 때문에 종종 발생하기 때문입니다. 이 상황은 콜백 피라미드 문제의 출현으로 이어졌습니다. 코드는 글을 쓰기가 어렵고 아름답 지 않을뿐만 아니라 코드를 읽는 사람들이 문제가 복잡 할 때 이해하기가 어렵습니다.
예를 들어 :
db.save (data, function (data) {// 무언가를 ... db.save (data1, function (data) {// 무언가를 ... db.save (data2, function (data) {// something ... done (data3); // return data});}); 데이터베이스 저장 작업이 있다고 가정하고 요청에 따라 3 개의 테이블로 데이터를 세 번 저장해야합니다. 그러면 우리의 코드는 위 코드와 유사합니다. 현재 두 번째 db.save 에 문제가 있으면 어떻게해야합니까? 이 고려 사항에 따라, 우리는 try...catch . 이것이 모든 악의 원천이며, 또한 처음에 노드가 널리 비판을 받았다는 점이기도합니다.
또 다른 단점은 세 가지 저장 사이에 전면 및 백의 종속성이 없다고 가정 할 때, 다음 단계가 실행되기 전에 이전 기능이 실행될 때까지 기다려야하며 세 저장을 병렬화 한 다음 세 저장 후 필요한 결과를 반환 할 수 없다는 것입니다. (또는 그것을 구현하려면 기술이 필요합니다)
불행히도, 처음 노드에 참여하기 시작했을 때, 나는 이와 같은 많은 지옥을 썼습니다.
나중에, 나는 여전히 더 많은 프론트 엔드 코드를 작성했기 때문에 ES6과 접촉하여 콜백 심약을 해결하기위한 강력한 도구를 찾았습니다.
실제로, ES6 Promise, Q, Q, Q, JS, Bluebird 및 기타 도서관은 이미 약속 표준 (약속/A+참조)을 기반으로 자신의 약속 휠을 이미 구축했습니다.
(나는 기사를 읽었고 그것이 의미가 있다고 생각합니다. 그것은 당신이 내장 된 기본 객체를 확장해서는 안된다고 말합니다.이 접근법은 미래 지향적 일 수 없습니다. 따라서 여기에는 팁이 있습니다. 기본 약속을 확장하는 라이브러리를 사용할 때 조심하십시오.)
여기서는 기본 약속 만 논의됩니다.
ES6 약속
약속 객체 상태
약속을 자세히 설명하기 전에 먼저 이론을 설명해 봅시다.
약속/A+ 사양은 약속 객체가 유한 상태 기계임을 규정합니다.
세 가지 상태가 있습니다.
1. pending (실행)
2. fulfilled (성공)
3. reject
pending 초기 상태 인 경우, fulfilled 및 rejected 종말 상태입니다 (최종 상태는 약속의 수명주기가 끝났음을 나타냅니다).
상태 전환 관계는 다음과 같습니다.
보류 중-> 이행, 보류 중-> 거부.
상태 전환으로 다양한 이벤트 (예 : 성공적인 실행 이벤트, 실행 실패 이벤트 등)가 트리거됩니다.
약속 양식
약속은 다음과 같습니다.
var promise = new Promise (함수 func (resolve (resolve), 거부) {// 무언가, 아마도 (성공) {return resolve (data);} else {return Reject (data);}}); promise.then (function (data) {// eg console.log (data);여기서 변수 약속은 약속 대상의 인스턴스입니다.
약속 객체가 만들어지면 func 함수의 논리가 실행됩니다.
논리가 처리되고 오류가 없으면 resolve 은 값을 특별한 장소로 전달합니다. 이 특별한 장소는 어디에 있습니까? 그것은 다음 코드에 있습니다. 우리는 콜백 함수를 사용 then 결과를 처리 resolve 후 결과를 처리합니다. 예를 들어, 위의 코드에서는 단순히 값을 콘솔에 출력합니다. 오류가 있으면 두 번째 then 함수로 reject 오류를 처리하십시오.
위의 유한 상태 머신 이론에 따라, 우리는 약속 생성자에서 콜백 함수 코드를 실행할 때 국가가 pending , 국가가 resolve 후 fulfilled 되고, reject 후 국가가 reject 된다는 것을 알고 있습니다.
약속 데이터 흐름
위는 약속의 첫 번째 데이터 흐름입니다.
재미있는 것은 then 약속의 방법이 여전히 약속 대상을 반환하여 then 사용하여 동일한 처리를 수행 할 수 있다는 것입니다.
첫 번째 콜백 기능은 첫 번째 콜백 기능을 결정한 then 첫 번째 약속 객체를 결정한 then 반환됩니다.
첫 then 콜백이 약속 객체를 반환하지 않는다고 가정하면, 두 번째 발신자 then 여전히 원래 약속 객체입니다. 그 값이 첫 번째 콜백 함수의 반환 값이된다는 점을 제외하고는 원래 약속 객체입니다.
첫 then 콜백 함수가 약속 객체를 반환한다고 가정하면, 두 번째 then 발신자 가이 새로운 약속 객체가되고 두 번째 then 새로운 약속 객체가 콜백을 해결하거나 거부하고 실행하기를 기다립니다.
나는 조금 아끼지 않았지만 여전히 그것에 대해 매우 분명하다고 생각합니다. 하하 ~
오류가 어디에서나 발생하면 오류가 두 번째 콜백 함수와 함께 then 두 번째 콜백 함수로 오류를 전달하여 처리합니다. 오류가 처리 될 때까지 오류가 뒤로 reject 것을 이해할 수 있습니다.
또한 Promise Object에는 메소드 catch 있어 오류를 처리하기위한 콜백 함수를 수용합니다.
지금 바로:
promise.catch (function (err) {// err.}))오류 처리가 유사하다고 가정하면이 방법은 오류를 중심으로 균일하게 처리 할 수 있습니다. 따라서 다른 방법은 두 번째 콜백이 필요하지 않습니다 ~
동시 약속을 통제하십시오
약속에는 "정적 방법" - Promise.all . 이 방법은 약속 객체의 배열 인 요소를 수용합니다.
이 방법은 또한 약속 객체를 반환합니다. 배열의 모든 약속 객체가 resolve 되면, resolve 값은 Promise.all 의 반환 값의 (약속 객체)의 resolve 값으로 배열로 사용되며 then 방법으로 처리 할 수 있습니다. 배열의 약속이 reject 되면, reject 값은 Promise.all 의 반환 값의 reject 값입니다.
매우 불투명 한 점은 다음과 같습니다.
then 메소드의 첫 번째 콜백 함수에 의해 수신 된 resolve 값의 순서 (위에서 언급 한 바와 같이)는 시간 순서 대신 Promise.all 의 매개 변수 배열의 순서와 동일합니다.
Promise.all Promise.race 와 유사한 방법도 있습니다.이 값은 첫 번째 값 만 resolve 것을 제외하고 배열을받습니다.
다른 개체를 약속 대상으로 바꾸십시오
Promise.resovle 메소드는 약속 객체를 매개 변수로 반환 할 수 있습니다.
두 가지 상황이 있습니다.
통과 된 매개 변수의 방법이 .then 가정하면, 반환 된 약속 객체는 resolve 상태가되고, resolve 값은 객체 자체입니다.
전달 된 매개 변수에 then 메소드 ( thenable 객체라고 함)가 있다고 가정하면,이 객체의 유형이 약속으로 변경되고 then 방법은 Promise.prototype.then 방법이됩니다.
약속은 비동기식에 대한 해결책입니까?
마지막으로, 매우 중요한 말을하겠습니다. 비동기 프로세스를 제어하기 위해 약속을 진정으로 사용하려면 ES6 generator 기능도 사용해야합니다. (예를 들어, TJ 마스터의 CO 라이브러리 구현).
그러나 ES7은 CO와 유사하지만 기본 지원이있는 async/await : 더 멋진 솔루션을 갖습니다. 기다렸다가 보자.
요약
위의 것은 JavaScript ES6의 기본 약속에 관한 것입니다. 이 기사의 내용이 ES6 학습의 모든 사람들에게 도움이되기를 바랍니다. 궁금한 점이 있으면 의사 소통 할 메시지를 남겨주세요.