복붙노트

[JQUERY] 문제 jQuery를 $ .Deferred에 내재 (jQuery를 1.x에서 / 2.x에서)

JQUERY

문제 jQuery를 $ .Deferred에 내재 (jQuery를 1.x에서 / 2.x에서)

해결법


  1. 1.업데이트 : jQuery를 3.0 아래에 설명 된 문제를 해결하고있다. 그것은 진정으로 약속 / A + 준수합니다.

    업데이트 : jQuery를 3.0 아래에 설명 된 문제를 해결하고있다. 그것은 진정으로 약속 / A + 준수합니다.

    말했다, 기사가 작성된 이후 jQuery를 더 약속 / Aplus의 불만으로 상당한 노력을하고 이제 그 때는 방법 체인이 있습니다.

    예상대로 그래서 심지어 jQuery를 returnsPromise (). 다음의 (a) 그 때는 (b)는 약속을 리턴하는 함수 a와 b에 대한 앞으로 계속하기 전에 반환 값을 풀기 작동합니다. 이 바이올린에 도시 된 바와 같이 :

    function timeout(){
        var d = $.Deferred();
        setTimeout(function(){ d.resolve(); },1000);
        return d.promise();
    }
    
    timeout().then(function(){
       document.body.innerHTML = "First";
       return timeout();
    }).then(function(){
       document.body.innerHTML += "<br />Second";
       return timeout();
    }).then(function(){
       document.body.innerHTML += "<br />Third";
       return timeout();
    });
    

    당신은 캐치는 달리, 그것을 해결하는 경우에도, "취급"으로 거부하는 jQuery를 약속을 표시 할 수있는 방법은 없습니다. jQuery를에이 차종의 거부는 동기 시도 / 캐치처럼 아무것도를 근본적으로 파괴하지 않고 사용에 아주 열심히.

    여기서 로그인 무엇을 추측 할 수 있나요? (깡깡이)

    timeout().then(function(){
       throw new Error("Boo");
    }).then(function(){
       console.log("Hello World");
    },function(){
        console.log("In Error Handler");   
    }).then(function(){
       console.log("This should have run");
    }).fail(function(){
       console.log("But this does instead"); 
    });
    

    당신이 추측하는 경우 "캐치되지 않는 오류 : 야유를"당신은 정확했다. jQuery를 약속 안전 던져되지 않습니다. 그들은 당신이 약속 / Aplus의 약속과는 달리 어떤 던져 오류를 처리하지 않습니다. 에 대한 안전은 무엇 거부? (깡깡이)

    timeout().then(function(){
       var d = $.Deferred(); d.reject();
       return d;
    }).then(function(){
       console.log("Hello World");
    },function(){
        console.log("In Error Handler");   
    }).then(function(){
       console.log("This should have run");
    }).fail(function(){
       console.log("But this does instead"); 
    });
    

    ""오류 처리기에서 "다음 로그 그러나이"대신 않습니다 - 모두에서 jQuery를 약속 거절을 처리 할 수있는 방법이 없습니다. 이것은 당신이 기대하는 흐름과는 달리입니다 :

    try{
       throw new Error("Hello World");
    } catch(e){
       console.log("In Error handler");
    }
    console.log("This should have run");
    

    어느 당신이 블루 버드와 Q 등의 약속 / A + 라이브러리를 얻을 흐름, 그리고 당신이 유용성에 대한 기대이다. 이 거대하고 던져 안전 약속에 대한 큰 판매 포인트이다. 여기에 블루 버드는이 경우에 올바르게 행동입니다.

    코드가 약속 여부를 우리가 이미 해결 거부 된 처리기를 부착하고에 따라 다르게 작동 할 수 있도록 jQuery를은 기본 약속은 이미 해결 된 경우를 연기 않고 즉시 전달 기능을 실행합니다. 이것은 효과적으로 Zalgo를 해제하고 가장 고통스러운 버그의 일부를 일으킬 수 있습니다. 이 디버그 버그에 가장 어려운 일부를 생성합니다.

    우리는 다음과 같은 코드를 보면 : (바이올린)

    function timeout(){
        var d = $.Deferred();
        setTimeout(function(){ d.resolve(); },1000);
        return d.promise();
    }
    console.log("This");
    var p = timeout();
    p.then(function(){
       console.log("expected from an async api.");
    });
    console.log("is");
    
    setTimeout(function(){
        console.log("He");
        p.then(function(){
            console.log("̟̺̜̙͉Z̤̲̙̙͎̥̝A͎̣͔̙͘L̥̻̗̳̻̳̳͢G͉̖̯͓̞̩̦O̹̹̺!̙͈͎̞̬ *");
        });
        console.log("Comes");
    },2000);
    

    누가 스택 오버 플로우가 발생하지 않습니다 결정적 API를 좋아하기 때문에 ... jQuery를의 실행 순서를 바꾸면 우리는 그 아 너무 위험한 행동, 마지막에 원래 시간 제한에 대한의 setTimeout 대기를 관찰 할 수있다? 약속 / A + 사양은 그 약속은 항상 이벤트 루프의 다음 실행을 연기하는 필요 이유입니다.

    가치가 Q들이 처리되지 않은 거부 자체를 파악 않기 때문에 같은 블루 버드 (실험적시)와 같은 새롭고 강력한 약속 라이브러리 체인의 끝에되는 .done을 필요로하지 않는다는 것을 언급, 그들은 훨씬 더 빨리 jQuery를 약속 또는 Q 약속보다 더있어 .

  2. from https://stackoverflow.com/questions/23744612/problems-inherent-to-jquery-deferred-jquery-1-x-2-x by cc-by-sa and MIT license