JavaScript에서 지연, 약속 및 미래의 차이점은 무엇입니까?


Answers

내가 OP의 질문에 어떻게 대답했는지에 대한 명백한 혐오에 비추어. 문자 그대로의 대답은 약속은 무언가가 다른 물건과 공유되는 반면, 연기는 비공개로 유지되어야한다는 것입니다. 주로 지연된 약속 (일반적으로 Promise를 확장)은 자체를 해결할 수 있지만 약속은 그렇게 할 수 없습니다.

세부 사항에 관심이 있다면 Promises/A+ 를 살펴보십시오.

지금까지 내가 알고있는 가장 중요한 목적은 표준화 된 인터페이스를 통해 명확성을 개선하고 커플 링을 느슨하게하는 것입니다. @ jfriend00에서 msdn.microsoft.com/en-us/magazine/gg723713.aspx 보기 :

콜백을 함수에 직접 전달하는 대신 밀접하게 결합 된 인터페이스로 이어질 수있는 약속을 사용하면 동기식 또는 비동기식 코드에 대한 우려를 분리 할 수 ​​있습니다.

개인적으로 비동기 요청으로 채워진 템플릿, 종속성 네트워크가있는 스크립트 로딩, 비 차단 방식으로 데이터를 형성하는 사용자 의견 제공과 같은 작업을 처리 할 때 특히 유용합니다.

사실 JSM 모드에서 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-psuedo 코드에 사과드립니다.하지만 핵심 아이디어가 다소 분명해지기를 바랍니다. 기본적으로 표준화 된 약속을 반환함으로써 약속을 전달할 수 있으므로보다 명확한 그룹화가 가능합니다.

Question

후불, 약속 및 선물의 차이점은 무엇입니까?
이 세 가지 모두에 일반적으로 승인 된 이론이 있습니까?




Promise 는 약속이 만들어 질 때 반드시 알려지지 않은 값에 대한 프록시를 나타냅니다. 비동기 액션의 최종 성공 값 또는 실패 이유에 핸들러를 연결할 수 있습니다. 이렇게하면 비동기 메서드에서 동기 메서드와 같은 값을 반환 할 수 있습니다. 최종 값 대신 비동기 메서드는 향후 어느 시점에서 값을 가질 것이라는 약속을 반환합니다.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

deferred.promise() 메서드를 사용하면 비동기 함수를 사용하여 다른 코드가 내부 요청의 진행 또는 상태를 방해하지 못하게 할 수 있습니다. Promise는 추가 핸들러를 연결하거나 상태를 결정하는 데 필요한 지연된 메소드 만 노출하지만 상태를 변경하는 것은 아닙니다 ( 해결, 거부, 통지, 해결, rejectWith 및 notifyWith ).

타겟이 제공되면, deferred.promise() 는 메소드를 그것에 첨부 한 다음 새로운 객체를 생성하지 않고이 객체를 리턴합니다. 이미 존재하는 개체에 약속 동작을 첨부하는 것이 유용 할 수 있습니다.

지연을 작성하는 경우 지연 또는 지연을 참조 할 수 있도록 지연을 참조하십시오. deferred.promise ()를 통해 Promise 객체 만 반환하면 다른 코드가 콜백을 등록하거나 현재 상태를 검사 할 수 있습니다.

PromiseDeferred 가 아직 완료되지 않은 작업을 나타내는 경우 알려지지 않은 값을 나타낼 수 있습니다.




선택된 답변을 포함하여 이러한 대답은 개념적으로 약속을 도입하는 데는 좋지만이를 구현하는 라이브러리를 사용할 때 발생 하는 중요한 차이점 (정확히는 차이점이 있음)에 대한 구체적인 내용이 부족합니다.

여전히 진화하고있는 스펙 이기 때문에 현재 en.wikipedia.org/wiki/Futures_and_promises 와 같은 참조와 jQuery 와 같은 두 가지 참조를 조사하는 것으로부터 오는 답은 다음과 같습니다.

  • Deferred : 대중적인 참고 문헌, en.wikipedia.org/wiki/Futures_and_promises Promises/A+ 3 4 에서는 결코 설명하지 않았지만 약속 결정의 중재자 ( resolvereject 구현)로서 구현에서 일반적으로 사용됩니다. 5 jQuery 7

    때로 지연은 또한 약속 (구현)이며, 지연만으로 해결할 수있는보다 순수한 것으로 간주되어 사용자가 사용에 대한 약속에 액세스하도록 강제합니다. 7

  • 약속 : 토론중인 전략에 대한 가장 포괄적 인 단어.

    동시성을 추상화하고자하는 대상 함수의 결과를 저장하는 프록시 객체와 다른 대상 함수를 받아들이고 새로운 약속을 반환하는 함수 then 노출하는 프록시 객체입니다. Promises/A+

    CommonJS 예 :

    > asyncComputeTheAnswerToEverything()
        .then(addTwo)
        .then(printResult);
    44
    

    누구의 책임 해결에 관해서는 언급하지 않았지만 항상 대중적인 참고 문헌에 설명되어 있습니다. en.wikipedia.org/wiki/Futures_and_promises Promises/A+ 3 4

    항상 인기있는 구현에 존재하고, 해결책을 제공하지 못했습니다. 5 jQuery 7

  • 미래 : 일부 인기있는 참고 문헌 en.wikipedia.org/wiki/Futures_and_promises 과 적어도 하나의 인기있는 구현 8 에서 발견되는 겉으로보기에는 비추천 된 용어이지만 '약속'이라는 용어에 우선하여 토론에서 제외되고 겉으로는 주제에 대한 대중적 소개에서 언급되지 않은 것 같습니다. 9

    그러나 적어도 하나의 라이브러리는 동 기성 및 오류 처리를 추상화하기 위해 일반적으로이 용어를 사용하지만 기능을 제공하지는 않습니다. '약속'이라는 용어를 의도적으로 사용하는 것을 의도적으로 피하는 것이 의도적 이었는지는 확실하지 않지만 약속은 '선택 가능'주위에 만들어지기 때문에 아마도 좋은 선택 일 수 있습니다. Promises/A+

참고 문헌

  1. en.wikipedia.org/wiki/Futures_and_promises
  2. 약속 / A + 사양
  3. 3
  4. 4
  5. 5
  6. jQuery
  7. 7
  8. 8
  9. 9
  10. 10

기타 잠재적으로 혼란스러운 것들




Domenic Denicola의 프레젠테이션이 나를 위해 모든 것을 실제로 클릭 한 것입니다.

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);
}

(그래도 여전히 복잡한 것처럼 들리면 프리젠 테이션을 시청하십시오!)

지연과 관련해서는 약속을 확인하거나 .reject() 하는 방법입니다. Promises/B 사양에서는 .defer() 라고합니다. jQuery에서는 $.Deferred() 입니다.

아는 한, jQuery의 Promise 구현은 적어도 jQuery 1.8.2 이상에서는 깨졌습니다 (그 요지를 참조하십시오).
아마도 CommonJS 구현하지만, "async try / catch"기능이 작동하지 않는다는 점에서 올바른 오류 처리를 얻지 못할 수도 있습니다. 불행한 점은 비동기 코드로 "시도 / 포착"하는 것이 아주 멋지 기 때문입니다.

약속을 사용하려는 경우 (자신의 코드로 시도해보십시오!), 7 . jQuery 버전은 더 깨끗한 jQuery 코드 작성을위한 콜백 애그리 게이터 일 뿐이지 만 그 핵심은 놓친다.

미래에 대해서는 전혀 모르겠다. 나는 API에서 그런 것을 보지 못했다.

편집 : Domenic Denicola의 youtube 토크 @Farm 의 코멘트 아래 에서 약속 합니다.

비디오에서 마이클 잭슨의 견적 (예, 마이클 잭슨 ) :

나는 당신이 당신의 마음 속에이 문구를 타 오르기를 바랍니다. 약속은 비동기적인 가치 입니다.

이것은 훌륭한 묘사입니다. 약속은 미래의 변수와 같습니다. 어떤 시점에서 존재할 (또는 일어날 수있는) 일류 참조입니다.