지연된 체인 충돌 브라우저

좋은 엉덩이

이것은 상자를 열고 닫을 수 있어야하는 작은 기능입니다. 열기 및 닫기는 일부 CSS 전환을 고려해야하므로 $.Deferred.

다음은 관련 코드입니다.

function Test(){

  // these are assigned Deferred objects during transitions
  this.opening = this.closing = false;

  this.isOpen = false;
  this.x = $('<div />').appendTo('body');
  this.x.width();
}

Test.prototype.open = function(){

  // box is already opening: return opening deferred
  if(this.opening)    
    return this.opening;

  // box is closing: this is the chain
  // that is supposed to wait for the box to close,
  // then open it again 
  if(this.closing)
    return this.closing.then((function(){
      return this.open();
    }).bind(this));

  // box is already open, resolve immediately
  if(this.isOpen)
    return $.when();    

  console.log('opening');
  this.opening = new $.Deferred();
  this.x.addClass('open');
  setTimeout((function(){
    this.opening.resolve();
    this.opening = false;
    this.isOpen = true;      
  }).bind(this), 1000);

  return this.opening;
};

close () 함수는 반대로 open ()입니다.

상자를 여는 동안 상자를 닫으려고 할 때 또는 그 반대의 경우 문제가 나타납니다. 예를 들면 :

var t = new Test();

t.open(); // takes 1 second

// call close() after 0.05s
setTimeout(function(){
  t.close();
}, 50);

스택 오버플로가 발생하는 것 같습니다. 누구든지 그 원인을 알고 있습니까?

전체 테스트 코드가 여기 에 있지만 시간 제한 값이 더 높기 때문에 Chrome이 충돌하지 않습니다.

예브 겐 사 프로 노프

코드에 몇 가지 문제가 있습니다.

  • promise 대신 지연된 객체를 반환 하면 promise에서만 .then ()을 실행할 수 있습니다.

  • 지연된 변수를 bool 값으로 재정의하고 대신 deferred.state ()를 사용하고 있습니다.

다음은 코드의 업데이트 된 버전입니다.

function Test(){
  this.opening = this.closing = false;
  this.isOpen = false;
  this.x = $('<div />').appendTo('body');
  this.x.width();
}

Test.prototype.open = function(){
  if(this.opening && this.opening.state() == 'pending')    
    return this.opening.promise();

  if(this.closing && this.closing.state() == 'pending')
    return this.closing.promise().then((function(){
      return this.open();
    }).bind(this));

  if(this.isOpen)
    return $.when();    

  console.log('opening');
  this.opening = new $.Deferred();
  this.x.addClass('open');
  setTimeout((function(){
    this.isOpen = true;    
    this.opening.resolve();
  }).bind(this), 1000);

  return this.opening.promise();
};

Test.prototype.close = function(){
  if(this.opening && this.opening.state() == 'pending') {
    console.log('opening is pending');
    return this.opening.promise().then((function(){
      console.log('opening is resolved');
      return this.close();
    }).bind(this));
  }

  if(this.closing && this.closing.state() == 'pending'){    
    console.log('closing is pending');
    return this.closing.promise();
  }

  if(!this.isOpen)
    return $.when();    

  console.log('closing');
  this.closing = new $.Deferred();
  this.x.removeClass('open');
  setTimeout((function(){
    console.log('closing resolved');
    this.closing.resolve();
    this.isOpen = false;
  }).bind(this), 1000);

  return this.closing.promise();  
};

var t = new Test();

t.open();

setTimeout(function(){
  t.close();
}, 15);

출력 :

"opening"
"opening is pending"
"opening is resolved"
"closing"
"closing resolved"

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

PHP로 인한 브라우저 충돌

분류에서Dev

브라우저 충돌시 sessionStorage 지우기

분류에서Dev

Regex로 인해 브라우저가 충돌합니까?

분류에서Dev

Excel 2013 앱 충돌-지원되지 않는 브라우저

분류에서Dev

각도 지시문 충돌 브라우저

분류에서Dev

내 정규식은 온라인 편집기에서 작동하지만 FireBug에서는 브라우저가 충돌합니다.

분류에서Dev

Jquery .replace 충돌 브라우저

분류에서Dev

Firefox의 개인 정보 보호 브라우징-충돌

분류에서Dev

구조체 충돌에 대한 C ++ 연결된 목록 포인터

분류에서Dev

.NET 네이티브 도구 체인으로 컴파일 된 UWP 앱은 사용자 지정 스타일로 인해 시작시 충돌합니다.

분류에서Dev

Linux Kernel Module : 지연된 작업 대기열로 인해 커널이 충돌 함

분류에서Dev

페이징 가능한 컬렉션에 몇 개의 페이지 매김이 적용된 후 브라우저가 충돌 함

분류에서Dev

Android 기본 브라우저 또는 모바일 브라우저 (활성화 된 경우) 확인

분류에서Dev

물체와 충돌하지 않는지 확인

분류에서Dev

기즈모 라인 주위에 충돌체 만들기

분류에서Dev

스프라이트가 충돌하지 않는 충돌

분류에서Dev

JavaScript에서 브라우저의 온라인 상태 감지

분류에서Dev

브라우저 while 루프의 becuase 충돌 계속

분류에서Dev

Internet Explorer 브라우저에서 jquery-1.8.2.js 충돌

분류에서Dev

내 스크립트가 브라우저와 충돌합니다.

분류에서Dev

Ubuntu 12.04에서 모든 브라우저 충돌

분류에서Dev

angular.js 리디렉션 브라우저 충돌

분류에서Dev

while 루프의 setTimeout이 브라우저와 충돌합니다.

분류에서Dev

chrome.tabs.query () 결과 브라우저 충돌

분류에서Dev

브라우저를 열 때 XUbuntu 16.04 충돌

분류에서Dev

브라우저를 열 때 XUbuntu 16.04 충돌

분류에서Dev

Handsontable 업데이트 셀 브라우저 충돌

분류에서Dev

왜이 브라우저 탭이 충돌합니까?

분류에서Dev

거의 즉시 충돌하는 여러 웹 브라우저

Related 관련 기사

  1. 1

    PHP로 인한 브라우저 충돌

  2. 2

    브라우저 충돌시 sessionStorage 지우기

  3. 3

    Regex로 인해 브라우저가 충돌합니까?

  4. 4

    Excel 2013 앱 충돌-지원되지 않는 브라우저

  5. 5

    각도 지시문 충돌 브라우저

  6. 6

    내 정규식은 온라인 편집기에서 작동하지만 FireBug에서는 브라우저가 충돌합니다.

  7. 7

    Jquery .replace 충돌 브라우저

  8. 8

    Firefox의 개인 정보 보호 브라우징-충돌

  9. 9

    구조체 충돌에 대한 C ++ 연결된 목록 포인터

  10. 10

    .NET 네이티브 도구 체인으로 컴파일 된 UWP 앱은 사용자 지정 스타일로 인해 시작시 충돌합니다.

  11. 11

    Linux Kernel Module : 지연된 작업 대기열로 인해 커널이 충돌 함

  12. 12

    페이징 가능한 컬렉션에 몇 개의 페이지 매김이 적용된 후 브라우저가 충돌 함

  13. 13

    Android 기본 브라우저 또는 모바일 브라우저 (활성화 된 경우) 확인

  14. 14

    물체와 충돌하지 않는지 확인

  15. 15

    기즈모 라인 주위에 충돌체 만들기

  16. 16

    스프라이트가 충돌하지 않는 충돌

  17. 17

    JavaScript에서 브라우저의 온라인 상태 감지

  18. 18

    브라우저 while 루프의 becuase 충돌 계속

  19. 19

    Internet Explorer 브라우저에서 jquery-1.8.2.js 충돌

  20. 20

    내 스크립트가 브라우저와 충돌합니다.

  21. 21

    Ubuntu 12.04에서 모든 브라우저 충돌

  22. 22

    angular.js 리디렉션 브라우저 충돌

  23. 23

    while 루프의 setTimeout이 브라우저와 충돌합니다.

  24. 24

    chrome.tabs.query () 결과 브라우저 충돌

  25. 25

    브라우저를 열 때 XUbuntu 16.04 충돌

  26. 26

    브라우저를 열 때 XUbuntu 16.04 충돌

  27. 27

    Handsontable 업데이트 셀 브라우저 충돌

  28. 28

    왜이 브라우저 탭이 충돌합니까?

  29. 29

    거의 즉시 충돌하는 여러 웹 브라우저

뜨겁다태그

보관