2017-01-07 15 views
3

配列であるグローバル変数window.listNodesがあります。この変数は、3秒ごとにリフレッシュされ、順番に入力されます。JavaScript:関数を一時停止し、グローバル変数を待つ

別の関数onOpen()がユーザーによってトリガーされ、3つの要素を含むグローバル変数window.listNodesを持つ必要があります。 私がやろうとしていること:グローバル変数が.lengthでない場合、プログラムはコードの他の部分がwindow.listNodesで満たされるのを待ってから、関数onOpen()をやり直します。

socket.onopen = function onOpen() { 
     if (window.listNodes.length === 3) { 
      // Do something 
     } else { 
      // Wait and when window.listNodes.length === 3: 
      onOpen(); 
     } 
    }); 
}; 

簡単な方法はありますか?私は、関数setTimeOut()とジェネレータ関数とキーワードyieldを試しましたが、失敗しました。

は、あなたの貴重な助けをありがとう:)

+0

私は関数 'setTimeOut'で試してみました。私は答えを' setTimeout'でどのように達成できるかを示しました。どのようにしましたか? –

答えて

3

をこれはそれを行うには、例えば、500ミリ秒を待つためにsetTimeoutとカスタム間隔を使用することができます。約束して

function onOpen() { 
     if (window.listNodes.length === 3) { 
      // Do something 
     } else { 
      // Wait and when window.listNodes.length === 3: 
      setTimeout(onOpen, 500); 
     } 
    }); 
}; 

socket.onopen = onOpen; 
1

function getListNodes() { 
    return new Promise(function check(resolve) { 
    if (window.listNodes.length === 3) { return resolve(window.listNodes); } 
    setTimeout(() => check(resolve), 500); 
    }); 
} 

socket.onopen = async function() { 
    const listNodes = await getListNodes(); 
    // use listNodes normally 
}; 

asyncの機能の中で、awaitキーワードは、それが待っているプロミスが解決されるまで機能を一時停止します(またはr排出される)。

getListNodes()から返されたPromiseは、500ミリ秒ごとにルックアップを再試行し、長さが十分であると分かった場合に解決します。

ネイティブでは、asyncの機能はChromeとEdgeでのみサポートされています。どこでもそれらを使用するには、Babel + Babelポリフィルが必要です。

関連する問題