2016-06-19 11 views
0

test.htmlКак синхронизировать доступ к глобальной переменной через два внешних JS-файлов

<html> 
    <head> 
     <script src="//ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script> 
     <script src = "./test1.js"></script> 
     <script src = "./test2.js"></script> 
    </head> 
</html> 

test1.js

var a; 
$(document).ready(function(){ 
    setTimeout(function(){ 
     a=10; 
    },1000); 
}); 

test2.js

$(document).ready(function(){ 
    //Busy waiting... doesn't Work. 
    /*while(typeof(a) === "undefined"){ 
     console.log(a); 
    };*/ 
    console.log(a); 
}); 

test2 печатает «а 'is undefined' ... Как синхронизировать 'a' над двумя файлами javascript?

+0

'while (typeof (a) ===" undefined ") {console.log (a); }; 'никогда не бывает хорошей идеей. Он заблокирует поток – mplungjan

ответ

1

Причина, по которой ожидание не работает, заключается в том, что JavaScript в браузерах имеет только одну тему, поэтому занятый-ожидание предотвращало код от test1.js от любого запуска. Занятие в ожидании почти никогда не является хорошей идеей в целом и по существу никогда не является хорошей идеей в браузере на основе JavaScript. :-)

В идеале эти два файла будут обеспечивать намеренный способ синхронизации между ними.

Но если нет событий, которые test2.js можно использовать, и если это, безусловно, правильно ждать, пока a не имеет значение, отличное от undefined, вы можете использовать setTimeout цикл:

test2.js:

$(document).ready(function(){ 
    function checkForA() { 
     if (typeof a === "undefined") { 
      // Keep waiting 
      setTimeout(checkForA, 10); // 50 = 50 milliseconds 
     } else { 
      // Got it 
      console.log(a); 
     } 
    } 

    checkForA(); 
}); 

Если можно избежать этого тайм-аута, используя какое-то уведомление от test1.js, это было бы лучше; но в худшем случае, опрос каждые 50 мс или около того не является большим делом. Это может быть хорошей идеей, чтобы он отказаться от какой-то момент:

$(document).ready(function(){ 
    var started = Date.now(); 

    function checkForA() { 
     if (typeof a === "undefined") { 
      // Still don't have it, keep waiting? 
      if (Date.now() - start > 10000) { // More than 10 seconds 
       // Give up 
       console.log("Gave up waiting for a"); 
      } else { 
       setTimeout(checkForA, 10); // 50 = 50 milliseconds 
      } 
     } else { 
      // Got it 
      console.log(a); 
     } 
    } 

    checkForA(); 
}); 
+0

. Я ожидал бы, что будет определено, но null, если test1.js загружен до test2.js – mplungjan

+0

@mplungjan, 'var a;' создаст переменную 'undefined', не так ли? В этом конкретном примере значение 'a' никогда не будет' null' – Rayon

+0

Ah. Правильно. Я никогда не использую un-initialized vars – mplungjan

0

пытаются заменить $(document).ready(function(){ с $(window).load(function(){ или вы можете использовать JS window.load=function(){. это будет ждать загрузки всех html, css и js, а затем выполнит код сценария в этой функции.

+0

Я уже пробовал «готово» test1.js и «загружал» test2.js (ниже ответ), но он не работал ... –

 Смежные вопросы

  • Нет связанных вопросов^_^