2017-06-13 79 views
0

我對JavaScript比較新,我試圖清理我的原型代碼,因爲它是buncha深層嵌套的回調函數,很難閱讀。我想實現這樣的事情:在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); 

我知道我可以在GoogleReady回調將所有call_when_ready但是這是一個簡單的例子,其中call_when_ready被稱爲在另一個回調。

,所以我想出了這個功能,但它不工作:正在填充

function call_when_ready(variable, callback) { 

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

    }, 3000); 
} 

變量總是空出即使g_map。我怎樣才能以乾淨的方式做到這一點?我也很樂意使用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個數據才能調用其他。 – 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(); 
}); 
相關問題