2017-06-13 24 views
0

私は比較的新しいjavascriptです。プロトタイプコードをクリーンアップしようとしています。コールバックの深いネストレベルであり、読みにくいからです。私はGoogleReadyコールバックですべてcall_when_readyを移動することができます知っているが、これはcall_when_readyが別のコールバックで呼び出された簡略化した例であるjavascriptの準備機能の呼び出しを作成する

GoogleMaps.ready(map_id_name, function(map) { 
    g_map = map.instance; 
}) 

... 

call_when_ready(g_map, set_map_viewport); 
call_when_ready(g_map, create_markers); 
call_when_ready(g_map, update_icons); 
call_when_ready(g_map, update_geometry_display); 
call_when_ready(g_map, update_ui_display); 

:私はこのような何かを達成しようとしています。

ので、私はこの機能を思い付いたが、それは動作しません:

function call_when_ready(variable, callback) { 

    let interval = setInterval(() => 
    { 
     if (variable != undefined && variable != null) { 
      clearInterval(interval); 
      callback(); 
     } 

    }, 3000); 
} 

変数は常にg_mapが移入されているにもかかわらず、nullを見せています。これをきれいにするにはどうすればいいですか?私はjQueryを使用することにもオープンしていますが、PromiseとDeffer edはあまりにも些細なことのように思えます。それとも私が知らないように、のようなコールバックをチェーン例えば、より良い方法があります:

function().finished(function).finished(alert("")); 

答えて

1

代わりにチェックするために変数を渡すので、あなたはそれを返す関数渡す場合、それは動作します:

/* mockup */ 
 
var g_map; 
 
var map_id_name = "example"; 
 
var GoogleMaps = { 
 
    ready: (a, f) => { 
 
    f({ 
 
     instance: 1 
 
    }); 
 
    } 
 
} 
 

 
// simulate map being ready after 2.5 seconds 
 
setTimeout(() => { 
 
    GoogleMaps.ready(map_id_name, function(map) { 
 
    g_map = map.instance; 
 
    console.log("g_map set"); 
 
    }); 
 
}, 2500); 
 

 
function call_when_ready(getVariable, callback) { 
 
    let interval = setInterval(() => { 
 
    if (getVariable()) { 
 
     clearInterval(interval); 
 
     callback(); 
 
    } 
 
    }, 2000); 
 
} 
 

 
function getGMap() { 
 
    return g_map; 
 
} 
 

 
call_when_ready(getGMap, set_map_viewport); 
 
call_when_ready(getGMap, create_markers); 
 

 
function set_map_viewport() { 
 
    console.log("set_map_viewport"); 
 
} 
 
function create_markers() { 
 
    console.log("create_markers"); 
 
}

+0

あなたは正しいです、これは興味深いです。私は元の変数を参照するのではなく、値のコピーがチェックされているので、私の場合はうまくいかないと思う。多分? – ArmenB

+0

それは私の推測です。 –

1

最も簡単なオプションは、私はあれば、あるGoogleMaps.ready機能への参照機能を移動するだろう既にコールバックと誤解されていない

+0

を、私は実際には別のコールバックで 'call_when_ready'を呼び出す必要があるとそれらの関数には、他の関数が依存する他のコールバックが再びあります。 – ArmenB

+0

連鎖機能を持っている場合は、連鎖内で連鎖を開始するといいでしょう。そうでなければ、与えられたものを使うのではなく、独自のリスナーを作成する必要があります。 –

+0

何かを呼び出す前に3または4のデータを待つ必要がある状況があるため、連鎖を避ける方法を探していますelse。 – ArmenB

2

g_mapは、GoogleMaps.readyコール内の匿名関数のローカルスコープに含まれています。

あなたの意図を正しく理解している場合は、すべての関数呼び出しを無名関数に移動する必要があります。

GoogleMaps.ready(map_id_name, function(map) { 
    g_map = map.instance; 
    set_map_viewport(); 
    create_markers(); 
    update_icons(); 
    update_geometry_display(); 
    update_ui_display(); 
}); 
関連する問題