1

setTimeOut を使用してマーカーを 1 つずつ表示しようとしていますが、機能していません。ここに私のコードがあります:

function showOneByOne(arrayOfMarkersObj) {
    for (u in arrayOfMarkersObj) {           
        setTimeout(function() {      
            arrayOfMarkersObj[u].setVisible(true);
        }, 3000);
    }
}

問題は、マップ上の最後のマーカーのみが表示され、すべてのマーカーが表示されないことです。しかし、私が置くと

arrayOfMarkersObj[u].setVisible(true);

setTimeOut の外では、すべてのマーカーが表示されます。

なぜそれが起こっているのですか?

4

2 に答える 2

2

キーを配列に保存します (ECMA5 対応のブラウザのみを使用している場合は、コメントで提案されているように、代わりにObject.keys()を使用できます:

var keys = [];
for (u in arrayOfMarkersObj)
    keys.push(u); //assuming arrayOfMarkersObj is an object not an array?

次に、次のように 1 つずつ移動しますsetTimeout

var current = 0;

function reveal() {
    arrayOfMarkersObj[keys[current++]].setVisible(true);
    if (current < keys.length) setTimeout(reveal, 3000);
}
reveal();

最初の遅延スイッチが必要な場合は、最後の行に次のように入力します。

setTimeout(reveal, 3000);

投稿の例が機能しない理由は、呼び出された時点で がu利用できないためです。setTimeoutイベントsetTimeoutセットによって呼び出されるコードは、windowオブジェクトで呼び出されます。

var を使用できるようにするには、通常はグローバル スコープまたはラッピング関数内に "レベルアップ" して格納する必要があります (参照that = thisとしてgets を使用し、次にinsideを使用してアクセスします)。thiswindowthatsetTimeout

于 2013-06-07T07:47:58.623 に答える
1

JavaScript では、内部スコープ内の変数の値は、変数が定義されているスコープにバインドされます。これは、コールバックが実行されると、定義されuたスコープ、つまり からの値を取得することを意味します。したがって、コールバックの実行ごとに (サイクル後の最終値)と等しくなります。ushowOneByOne()uarrayOfMarkersObj.length -1for

解決する簡単な方法の 1 つはforEachを使用することですが、要素ごとに異なるコールバック/タイマーの必要性が明確ではありません。Ken-Abdias Softwareの回答で提案されているように、単一のものを使用することもできます。

于 2013-06-07T07:49:26.847 に答える