2011-02-15 2 views
0

Любая идея, почему следующий код:OnLoad функции розжига Out Of Order

<script>   
     var access_token; 
     var access_token_secret;   

     function Login(){ 
      img = document.getElementById('authenticate'); 
      img.src = 'authenticate.png'; 
      login = document.getElementById('login'); 
      login.style.visibility="visible"; 
     } 
     function cookieHandlerStep1(){ 
      chrome.cookies.get({ 
       url:URL_GOES_HERE, 
       name:'access_token' 
      }, 
      function(cookie){ 
       if(cookie){ 
        access_token = cookie['value']; 
        cookieHandlerStep2(); 
       } else{ 
        Login(); 
       } 
      }); 
     } 
     function cookieHandlerStep2(){ 
      chrome.cookies.get({ 
       url:URL_GOES_HERE, 
       name:'access_token_secret' 
      }, 
      function(cookie){ 
       if(cookie){ 
        access_token_secret = cookie['value']; 
        Interact(); 
       } else{ 
        Login(); 
       } 
      }); 
     } 
     function Interact(){ 
      alert(access_token); 
      xhr = new XMLHttpRequest(); 
      xhr.open("GET", URL_GOES_HERE, true); 
      xhr.onreadystatechange = function() { 
       if (xhr.readyState == 4) { 
        document.write(xhr.responseText); 
       } 
      } 
      xhr.send(); 
     } 
    </script> 


<body onload="cookieHandlerStep1(),cookieHandlerStep2(),Interact()"> 

Может, возможно, имеют функции выполняющиеся из последовательности?

ответ

2

Они не увольняются из строя. Вы предоставили обратные вызовы к chrome.cookies.get, которые не гарантируются для вызова до остальной части кода. Первая функция возвращается до срабатывания обратных вызовов, и вызываются следующие два (cookieHandlerStep2() и Interact()).

Однако в этих обратных вызовов, cookieHandlerStep1() уже призывает cookieHandlerStep2() который затем вызывает Interact() - так что я предполагаю, что вы на самом деле хотите в вашем onload это только первая функция, чтобы начать цепочку:

<body onload="cookieHandlerStep1()"> 
+0

Это очень полезно , Я, однако, забыл полностью отредактировать код. CookieHandlerStep1 в обновленном коде не запускает CookieHandlerStep2. Не работает CookieHandlerStep2 fire Interact(). Я думаю, что важно, что вы сказали, что обратные вызовы не гарантируются для вызова до остальной части кода. Что со мной произошло (прежде чем я отредактировал каждую функцию, чтобы вызвать следующую функцию в цепочке), срабатывал Interact(), затем CookieHandlerStep1() и, наконец, CookieHandlerStep2(). Не могли бы вы немного объяснить, почему функция обратного вызова не выполняется до следующей функции? –