2017-06-13 47 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(); 
}); 
相关问题