JavaScript에서 지연, 약속 및 미래의 차이점은 무엇입니까?
아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 네?
이 세 가지 배경에는 일반적으로 인정된 이론이 있나요?
선택된 답변을 포함한 이러한 답변은 개념적으로 약속을 소개하는 데는 좋지만, 라이브러리를 사용할 때 발생하는 용어에서 정확히 어떤 차이가 있는지 구체적으로 알 수 없습니다(그리고 중요한 차이도 있습니다).
아직 진화하는 사양이기 때문에, 현재는 레퍼런스(Wikipedia 등)와 실장(jQuery 등)의 양쪽 모두를 조사하려고 하고 있습니다.
연기:일반적인 레퍼런스에는 기재되어 있지 않지만, 실장에서는 약속 해결(실장)의 결정자로서 일반적으로 사용됩니다.
resolve
★★★★★★★★★★★★★★★★★」reject
를 참조해 주세요.도 약속입니다().
then
Deferred를 해결만 할 수 있고 사용자에게 사용 약속에 대한 접근을 강요하는 것이 더 순수하다고 생각되는 경우도 있습니다.then
를 클릭합니다.약속:논의 중인 전략에 대한 가장 포괄적인 단어.
, 「」, 「」, 「」, 「」, 「」, 「」, 「」, 「」, 「」, 「」의 공개합니다.
then
함수는 다른 대상 함수를 받아들이고 새로운 약속을 반환합니다. 2> asyncComputeTheAnswerToEverything() .then(addTwo) .then(printResult); 44
책임 해결의 대상이 누구인지는 명시되어 있지 않지만, 항상 일반적인 레퍼런스에 기재되어 있습니다. 1 2 3 4
미래: 일부 인기 있는 언급과 적어도 하나의 인기 있는 구현에서 볼 수 있듯이, 겉보기에는 '약속'이라는 용어가 선호되어 논의에서 점차 배제되고 있으며, 이 주제에 대한 인기 있는 소개에서 항상 언급되는 것은 아니다. 9
으로 이 및 처리를 위해 단, 1개의 라이브러리는 이 용어를 제공하지 .
then
기능성. 10 '약속'이라는 용어를 피하는 것이 의도적인 것인지 확실하지 않지만, 약속은 '그때'를 중심으로 만들어지기 때문에 아마도 좋은 선택일 것이다.
레퍼런스
- 약속과 미래에 관한 위키피디아
- 약속/A+사양
- 약속에 관한 DOM 표준
- DOM 표준 사양 WIP 약속
- DOJO 툴킷 지연
- jQuery
- Q
- Future JS
- Promise의 기능성 Javascript 섹션
- AngularJS 통합 테스트의 미래
혼동할 수 있는 사항
-
(TL;DR, Promise/A+는 대부분 Promise/A의 애매함을 해결합니다.)
작전부 질문에 대답하려고 했던 게 싫어서요문자 그대로의 대답은 약속은 다른 오브젝트와 공유되는 것이지만, 연기된 것은 비공개로 유지되어야 한다는 것입니다.우선, 지연된(일반적으로 Promise를 연장하는) 문제는 스스로 해결할 수 있지만, 약속은 해결하지 못할 수 있습니다.
세부 사항에 관심이 있다면 Promise/A+를 검토하십시오.
제가 알기로는 가장 중요한 목적은 표준화된 인터페이스를 통해 명확성을 개선하고 커플링을 느슨하게 하는 것입니다.@jfriend00에서 권장하는 내용을 참조하십시오.
콜백을 함수에 직접 전달하는 것이 아니라, 밀접하게 결합되는 인터페이스를 사용하는 것으로써, 동기 코드와 비동기 코드에 관한 염려를 분리할 수 있습니다.
개인적으로 지연은 비동기 요청에 의해 채워지는 템플릿, 종속성이 있는 스크립트를 로드하는 경우, 사용자 피드백을 제공하여 데이터를 비블로킹 방식으로 구성할 때 특히 유용합니다.
실제로 JS 모드에서 CodeMirror를 비동기식으로 로드한 후 수행하는 순수한 콜백 형식을 비교해 보십시오(애플리케이션: jQuery는 한동안 사용하지 않았습니다).
/* assume getScript has signature like: function (path, callback, context)
and listens to onload && onreadystatechange */
$(function () {
getScript('path/to/CodeMirror', getJSMode);
// onreadystate is not reliable for callback args.
function getJSMode() {
getScript('path/to/CodeMirror/mode/javascript/javascript.js',
ourAwesomeScript);
};
function ourAwesomeScript() {
console.log("CodeMirror is awesome, but I'm too impatient.");
};
});
공식화된 버전 약속(다시 말씀드리지만 jQuery에 대한 최신 정보가 없습니다) :
/* Assume getScript returns a promise object */
$(function () {
$.when(
getScript('path/to/CodeMirror'),
getScript('path/to/CodeMirror/mode/javascript/javascript.js')
).then(function () {
console.log("CodeMirror is awesome, but I'm too impatient.");
});
});
semi pseudo code는 죄송하지만, 핵심 아이디어가 어느 정도 명확해졌으면 합니다.기본적으로 표준화된 약속을 반환함으로써 약속을 전달할 수 있으므로 보다 명확한 그룹화가 가능합니다.
나를 정말 감동시킨 것은 도메닉 데니콜라의 프레젠테이션이었다.
Github의 요지에서는, 그는 내가 가장 좋아하는 설명을 했다.그것은 매우 간결하다.
약속의 요점은 비동기 세계에서 기능적 구성과 오류를 되돌려주는 것입니다.
즉, 약속은 비동기 코드를 동기 코드처럼 쉽게 작성할 수 있도록 하는 방법입니다.
다음 예시와 약속에 대해 생각해 봅시다.
getTweetsFor("domenic") // promise-returning async function
.then(function (tweets) {
var shortUrls = parseTweetsForUrls(tweets);
var mostRecentShortUrl = shortUrls[0];
return expandUrlUsingTwitterApi(mostRecentShortUrl); // promise-returning async function
})
.then(doHttpRequest) // promise-returning async function
.then(
function (responseBody) {
console.log("Most recent link text:", responseBody);
},
function (error) {
console.error("Error with the twitterverse:", error);
}
);
이것은, 다음의 동기 코드를 기술하고 있는 것처럼 동작합니다.
try {
var tweets = getTweetsFor("domenic"); // blocking
var shortUrls = parseTweetsForUrls(tweets);
var mostRecentShortUrl = shortUrls[0];
var responseBody = doHttpRequest(expandUrlUsingTwitterApi(mostRecentShortUrl)); // blocking x 2
console.log("Most recent link text:", responseBody);
} catch (error) {
console.error("Error with the twitterverse: ", error);
}
(아직도 복잡한 것 같으면 프레젠테이션을 보세요!)
Delayed에 관해서는.resolve()
또는.reject()
약속들.Promise/B 사양에서는 다음과 같이 부릅니다..defer()
jQuery에서는$.Deferred()
.
제가 알기로는 적어도 jQuery 1.8.2 시점에서는 jQuery의 Promise 구현이 깨져 있습니다(그 요지를 참조).
Promise/A를 구현하고 있을 것으로 생각되지만, "비동기 시도/캐치" 기능 전체가 작동하지 않는다는 점에서 필요한 올바른 오류 처리를 얻을 수 없습니다.비동기 코드를 사용하여 "시도/캐치"를 하는 것은 매우 멋진 일이기 때문에 유감입니다.
Promise를 사용하는 경우(자신의 코드로 시험해 볼 필요가 있습니다!), Kris Kowal의 Q를 사용합니다.jQuery 버전은 보다 깔끔한 jQuery 코드를 쓰기 위한 콜백 애그리게이터일 뿐이지만 요점을 알 수 없습니다.
Future에 대해서는 잘 모르겠습니다.어느 API에서도 본 적이 없습니다.
편집: 도메닉 데니콜라의 유튜브에서 @Farm의 코멘트에서 약속에 대해 다음과 같이 말하고 있습니다.
동영상에서 마이클 잭슨(네, 마이클 잭슨)의 말을 인용합니다.
이 문구를 마음에 새겨두셨으면 합니다.약속은 비동기적인 가치입니다
이것은 훌륭한 설명입니다: 약속은 미래의 변수와 같습니다. - 어떤 시점에서 존재할(또는 일어날) 무언가에 대한 1등급 참조입니다.
약속은 약속이 생성될 때 반드시 알 수 없는 값의 프록시를 나타냅니다.이를 통해 처리기를 비동기 작업의 최종 성공 값 또는 실패 원인에 연결할 수 있습니다.이를 통해 비동기 메서드는 동기 메서드와 같은 값을 반환할 수 있습니다.비동기 메서드는 최종 값 대신 미래의 어느 시점에서 값을 가질 것이라는 약속을 반환합니다.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise
그deferred.promise()
method를 사용하면 비동기 함수가 다른 코드가 내부 요청의 진행 또는 상태에 간섭하는 것을 방지할 수 있습니다.Promise는 추가 핸들러를 연결하거나 상태를 판별하는 데 필요한 지연 메서드(그 후 done, fail, always, pipe, progress, state 및 promise)만 공개하고 상태를 변경하는 메서드(해결, 거부, 통지, 해결, 거부)는 공개하지 않습니다.포함 및 알림포함)
되어 있는 , 「」deferred.promise()
는 메서드를 첨부한 후 이 오브젝트를 반환하고 새 오브젝트를 만듭니다.이는 Promise 동작을 이미 존재하는 개체에 연결할 때 유용합니다.
[Deferred]를 작성하는 경우 [Deferred]에 대한 참조를 유지하여 어느 시점에서 해결하거나 거부할 수 있도록 합니다.다른 코드가 콜백을 등록하거나 현재 상태를 검사할 수 있도록 deferred.promise() 경유로 Promise 개체만 반환합니다.
간단히 말하면, Promise는 아직 알려지지 않은 값을 나타내며, 여기서 Delayed는 아직 완료되지 않은 작업을 나타냅니다.
- A
promise
는 아직 않은 . - A
deferred
않은 .
약속은 처음에는 알 수 없는 결과의 자리 표시자이며, 지연은 값을 산출하는 계산을 나타냅니다.
언급
언급URL : https://stackoverflow.com/questions/6801283/what-are-the-differences-between-deferred-promise-and-future-in-javascript
'programing' 카테고리의 다른 글
문자열 "XML safe"는 어떻게 만드나요? (0) | 2022.12.29 |
---|---|
문자열 목록을 어떻게 정렬합니까? (0) | 2022.12.29 |
XAMPP 제어판 v3.2.1에서 VMware 포트 오류 443을 중지하는 방법 (0) | 2022.12.29 |
인수로 튜플 확장 (0) | 2022.12.19 |
JavaScript 폐쇄 vs. 익명 함수 (0) | 2022.12.19 |