2016-06-19 17 views
0

test.htmlというどのように私は

<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のプリントは「2つの外部JSファイル間のグローバルVARにアクセスして同期させることができます'is' undefined '... 2つのjavascriptファイルで' a 'をどのように同期させることができますか?

+0

'while(typeof(a)===" undefined "){console.log(a);} };は決して良い考えではありません。それはスレッドをブロックします – mplungjan

答えて

1

ビジー待機が機能しなかった理由は、ブラウザでJavaScriptが一つだけメインスレッドを持っているので、ビジーウェイトが今まで実行しているからtest1.jsからコードを防止していることです。ビジー待機は、一般的には決して良いアイデアではなく、ブラウザベースのJavaScriptでは本質的に決して良いアイデアではありません。 :-)

理想的には、2つのファイルは意図的にそれらの間で同期する方法を提供します。

しかし

test2.jsが使用できるというイベントがありません、それは aundefined以外の値になるまで待たなければ間違いなく正しいだ場合は、 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から何らかの通知を使用してこのタイムアウトループを回避することができれば、それは良いでしょう。最悪の場合、50msごとにポーリングするのは大したことではありません。

$(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

test1.jsがtest2.jsの前にロードされている場合、私は定義されているがnullとなることを期待します。 – mplungjan

+0

@mplungjan、 'var a;'は 'undefined'変数を作成しますか?この特定の例では、「a」の値は決して「ヌル」にならない。 – Rayon

+0

ああ。右。 'test1.js'が' test2.js'の前にロードされていれば 'a'は存在しますが、' test1.js'のレディハンドラが起動するまで値は 'undefined'になります。 – mplungjan

0

試みが$(window).load(function(){$(document).ready(function(){を交換するか、JS window.load=function(){を使用することができます:いくつかの点であきらめ持つことは良い考えかもしれません。これはすべてのhtml、css、jsがロードされ、その関数でスクリプトコードが実行されるのを待ちます。

+0

私はすでに '準備ができている' test1.jsと 'load' test2.js(答えの下)を試しましたが、うまくいきませんでした... –