2013-04-25 3 views
0

편집 - 스크립트 파일에 JS 바이올린 링크 - http://jsfiddle.net/r4uH3/jQuery 플러그인은 비동기 적으로 실행

편집 문제는 이미 폐쇄 만 허용 대답이, 내가 대답을 수락 이유에 대한 몇 가지 세부 사항을 추가 할 생각이 RE 이하.

원래 코드가 작동하지 않는 이유 - How do I return the response from an asynchronous call? - AJAX는 문자 그대로 관련이 없지만 비동기에 대한 설명은 중요합니다.

나는 약간 적응하지만 파브 매트의 대답은 나를 위해 완벽하게 작동합니다 :

(function($){ 
    // some pre-iteration stuff here 

    // iteration vars 
    var elementIndex = 0; 
    var collectionLength = this.size(); 
    var ts = this; 

    // THIS IS THE KEY BIT AS PER ACCEPTED ANSWER 
    // RATHER THAN USING THE NORMAL "this.each" 
    (function initLoop(){ 

     // check if got to last element 
     if (elementIndex < collectionLength){ 

      // DO STUFF, WHATEVER, AS LONG AS YOU DON'T EXPECT 
      // ASYNCHRONOUS FUNCTIONS LIKE AJAX/TIMERS NOT TO, WELL, EXECUTE ASYNCHRONOUSLY UNLESS YOU HANDLE THEM PROPERLY!! 


      // AND FINALLY - GO TO NEXT ELEMENT IN COLLECTION 
      initLoop(); 
     }; 

    })()); 
})(jQuery); 

도움이 다른 것은, 정확히는 관련, 저장 글로벌 및 요소 별 변수를 사용하지 않고 jQuery(el).data();을 사용하고 있었다 아니지만 window.VARIABLENAME 또는 MyNamespace.VARIABLE_NAME을 사용하는 것보다 예 :

// outside of iteration 
jQuery(window).data("GLOBAL_STUFF", { /* add properties here and set them later*/ }); 
var globalData = jQuery(window).data("GLOBAL_STUFF"); 

// inside iteration 
jQuery(currentElement).data("ELEMENT_DATA", { /* add properties here and set them later*/ }); 
var elementData = jQuery(window).data("ELEMENT_DATA"); 

// then set props like so (obviously get, similarly..) 
globalData.someArrayOfSomething.push(something); 
elementData.someBooleanValue = true; 

다시 Fabrício에게 감사드립니다.


  1. I는 대부분 같은 여러상에서 실행될 수있다하는 jQuery 플러그인 요소 (즉들의 집합)을 작성했다.

  2. 함수의 this.each(function(i,el){ }); 부분에서 다른 객체 유형의 새 인스턴스를 만들고 (jQuery와는 아무런 관련이 없음) "Init"메소드를 호출합니다.

  3. .each 루프를 사용하면 이후에 다음 인스턴스 으로 루프 될 것으로 예상됩니다. init 메소드가 완전히 실행되었습니다.

  4. 어디서나 비동기 (AJAX/타이머)를 사용하지 않습니다.

  5. 나는 "jQuery.fadeIn"또는 유사 항목에 대해 항상과 같은 콜백을 사용하고 있습니다.

초기화 방법은 거의 평행이라고하는 문제. 그들은 다음 번 호출되기 전에 실행을 완료하지 않습니다.

알려진 문제에 관해 조언 해 줄 수있는 사람이 있습니까? 위의 "이론"에서 빠진 것이 있습니까?

jQuery 2.0 사용. 당신의 for 루프를 교체

+3

데이터가 충분하지 않습니다 :

다음은 위와 같이 매우 유사한 구조를 사용하여보다 실용적인 비동기 데모입니다. 비동기 코드를 다루는 경우 적어도 [SSCCE] (http://sscce.org/)를 게시해야합니다. 코드가 없으면 객체의'init' 함수를 적용하여 콜백 매개 변수를 받거나 지연된 인스턴스를 반환하도록 권고 할 수 있습니다. –

+0

@ FabrícioMatté 고맙겠지 만 코드의 양은 엄청납니다. init 메소드도 상당히 길다. 이미 콜백을받습니다. 또한, "지연 인스턴스 반환"에 대한 의미를 설명 할 수 있습니까? – LiverpoolsNumber9

+0

어떤 코드가 어떤 순서로 실행되는지 알고 싶다면 브라우저의 JavaScript 디버거가 무엇인지 알아야합니다. – Blazemonger

답변

2

시도 :

var i = 0, 
    l = window.JRTE_INSTANCES.length; 
(function initloop() { 
    if (i < l) window.JRTE_INSTANCES[i].Init(initloop); 
    i++; 
}()); 

window.JRTE_INSTANCES[0].Init를 호출하여 초기화 루프를 시작합니다. initloopInit이 종료되면 다시 Init으로 시작하고 다음은 i으로 시작하여 모든 인스턴스를 반복 할 때까지 콜백으로 전달됩니다.Fiddle

+0

나는 그것을 테스트하지 않았지만 논리가 맞다고 믿습니다. 콜백 시스템이 충분하면 오래 사용할 수 있습니다. –

+1

올바른 것으로 보입니다. 코드의 문제는 startEditor에 비동기 코드 (즉, jQuery.fadeIn)가 포함 된 것 같습니다. 따라서 원본 피델의 코드를 사용하면 첫 번째 fadeIn이 완료되기 전에 모든 Init 호출이 이루어집니다. 이전 전화 콜백 내에서 다음 Init 호출을하려면 OP가 원하는 것처럼 들립니다. – dancek

+0

@ dancek 예, 케빈이 질문에 댓글을 달았을 때 그 사실을 알았습니다. 추가 설명해 주셔서 감사합니다. '=]' –

관련 문제