공식 소개를 시작하기 전에 JavaScript Promise가 어떻게 보이는지보고 싶습니다.
코드 사본은 다음과 같습니다.
var p = 새로운 약속 (함수 (function, 거부) {
결의 ( "Hello World");
});
P. then (function (str) {
경고 (str);
});
1. 그런 다음 ()는 포크 약속을 반환합니다
다음 두 코드의 차이점은 무엇입니까?
코드 사본은 다음과 같습니다.
// 전시회 a
var p = 새로운 약속 (/*...*/);
P. 그 (func1);
P. (func2);
// 전시 b
var p = 새로운 약속 (/*...*/);
P. 그 (func1)
. 그런데 (func2);
위의 두 가지 코드에 해당하는 것을 신중하게 고려하면 약속은 단지 1 차원의 콜백 함수 배열입니다. 그러나 이것은 사실이 아닙니다. 그런 다음 각 () 전화는 포크 약속을 반환합니다. 따라서 Exhipa에서 func1 ()가 예외를 던지면 func2 ()가 여전히 정상적으로 호출됩니다.
Exhibitb에서 func1 ()가 오류를 던지면 첫 번째 호출이 새로운 약속을 반환하기 때문에 fun2 ()가 호출되지 않습니다. 결과는 func2 ()가 건너 뜁니다.
요약 : 약속은 복잡한 흐름도와 유사한 여러 경로로 포크 될 수 있습니다.
2. 콜백은 결과를 전달해야합니다
다음 코드를 실행할 때 경고는 무엇입니까?
코드 사본은 다음과 같습니다.
var p = 새로운 약속 (함수 (function, 거부) {
결의 ( "Hello World");
});
p.then (function (str) {})
.
경고 (str);
});
두 번째 ()의 경고는 아무것도 표시하지 않습니다. 콜백 함수는 약속의 맥락에서 결과가 변경되어 콜백 기능이 없기 때문입니다. Promise는 콜백이 동일한 결과 또는 교체 결과를 반환 할 것으로 예상하여 다음 콜백으로 전달됩니다.
Adpater를 사용하여 결과를 변경하는 것과 유사합니다.
코드 사본은 다음과 같습니다.
var feettometres = function (ft) {return ft*12*0.0254};
var p = 새로운 약속 (/*...*/);
P. 그 (feettometres)
.
경고 (미터);
});
3. 이전 레이어의 예외 만 잡을 수 있습니다.
이 두 코드의 차이점은 무엇입니까?
코드 사본은 다음과 같습니다.
// 전시회 a
새로운 약속 (기능 (결의, 거부) {
결의 ( "Hello World");
})
.그 다음에(
함수 (str) {
새로운 오류를 던지십시오 ( "uh oh");
},
한정되지 않은
))
.그 다음에(
한정되지 않은,
함수 (오류) {
경고 (오류);
}
);
// 전시 b
새로운 약속 (기능 (결의, 거부) {
결의 ( "Hello World");
})
.그 다음에(
함수 (str) {
새로운 오류를 던지십시오 ( "uh oh");
},
함수 (오류) {
경고 (오류);
}
);
첫 번째 코드에서, 첫 번째 코드의 예외는 다음 ()의 예외가 발생하여 두 번째 ()에 의해 잡히고 "uh oh"경고가 트리거됩니다. 이 안내서는 이전 수준의 예외 만 잡히게됩니다.
두 번째 코드 조각에서 콜백 함수 및 오류 콜백 함수는 동일한 레벨이므로 콜백에서 예외가 발생하면 잡히지 않습니다. 실제로, 두 번째 코드의 오류 콜백은 약속이 거부되거나 약속 자체가 잘못된 경우에만 발생합니다.
4. 오류를 복원 할 수 있습니다
오류 콜백 함수에서 오류를 다시 줄이지 않으면 오류에서 복구하고 해결 된 상태로 반전되었다고 약속합니다. 다음 예에서는 첫 번째 ()의 오류 콜백이 예외를 다시 제외하지 않기 때문에 "Is Saved"가 표시됩니다.
코드 사본은 다음과 같습니다.
var p = 새로운 약속 (함수 (function, 거부) {
거부 (새 오류 ( "pebkac"));
});
P. 그 (
한정되지 않은,
함수 (오류) {}
))
.그 다음에(
함수 (str) {
경고 ( "나는 구원 받았다!");
},
함수 (오류) {
경고 ( "나쁜 컴퓨터!");
}
);
약속은 양파의 층으로 볼 수 있습니다. 그런 다음 각각 ()은 양파에 다른 레벨을 추가합니다. 각 레벨은 처리 된 활동을 나타냅니다. 계층 구조가 완료되면 결과는 고정되어 다음 계층을 위해 준비된 것으로 간주됩니다.
5. 약속을 중단 할 수 있습니다
그 다음에 실행할 준비가 되었기 때문에 () 메소드에서 사전에 잠시 멈추고 실행할 수 없다는 의미는 아닙니다. 현재의 약속을 일시 중지하거나 다른 약속이 완료 될 때까지 기다리려면 그 당시의 또 다른 약속을 돌려주십시오.
코드 사본은 다음과 같습니다.
var p = 새로운 약속 (/*...*/);
P. then (function (str) {
if (! 로그인) {
새로운 약속을 돌려주십시오 (/*...*/);
}
})
.
경고 ( "완료");
})
이전 코드에서는 새로운 약속이 구문 분석 될 때까지 프롬프트가 나타나지 않습니다. 이는 기존 비동기 코드 경로에 더 많은 종속성을 도입하는 편리한 방법입니다. 예를 들어, 사용자 세션에 시간 초과가 있고 이전 코드 경로를 계속하기 전에 두 번째 로그인을 초기화 할 수 있습니다.
6. 해결 된 약속은 즉시 실행되지 않을 것입니다
다음 코드를 실행할 때 프롬프트 상자를 얻을 수 있습니까?
코드 사본은 다음과 같습니다.
함수 runme () {
var i = 0;
새로운 약속 (기능 (결의) {
해결하다();
})
. 그런데 (function () {
i += 2;
});
경고 (i);
}
약속이 즉시 구문 분석되고 () 방법이 즉시 실행되므로 프롬프트 2가 조사 될 것이라고 생각할 수 있습니다. 그러나 약속 정의는 모든 통화가 비동기식이어야합니다. 따라서 프롬프트가 수정되기 전에 생성됩니다.