作为参数传递的函数的异步执行
Asynchronous execution of a function passed as an argument
我面临以下问题。我想使用谷歌的地理编码服务在地图上绘制一些标记。但是,标记在地理编码完成其工作之前就已实例化。 drawMarker
函数将返回一个未定义location
Marker
。
我尝试将地理编码函数作为参数传递给drawMarker
函数,并在那里执行它。我以为这样我就能实现同步行为,但事实并非如此。简化代码如下:
drawMarker(i, map, codeAddress, locationsToConvert[i]);
function drawMarker(i, map, func, arg) {
var location = func.apply(this, [arg]);
return new google.maps.Marker({
position: {lat: location.lat, lng: location.lng},
map: map,
html: locations[i][0],
id: i
});
}
function codeAddress(address) {
geocoder.geocode( { 'address': address}, function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
return results[0].geometry.location
}
});
}
我的解决方案是什么,哪一个是最好的,也许:
- 使用承诺界面?
- 在一个函数中执行所有操作并在地理编码服务的回调中实例化
Marker
? - 其他?
您可以尝试先获取地址,并在获得地址后从回调中调用drawMarker
。编辑drawMarker
接近它的外观,我没有完整的代码,所以可能不是 100% 正确的。
codeAddress(locationsToConvert[i]);
function drawMarker(i, map, location) {
return new google.maps.Marker({
position: {lat: location.lat, lng: location.lng},
map: map,
html: locations[i][0],
id: i
});
}
function codeAddress(address) {
geocoder.geocode( { 'address': address}, function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
drawMarker(i, map, results[0].geometry.location);
}
});
}
您必须将 drawMarker 放在地理编码器回调中
function codeAddress(address) {
geocoder.geocode({ 'address': address}, function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
drawMarker(map,results[0].geometry.location);
}
});
}
看看这个 -> 小提琴的例子
为什么不转换location
然后在返回后调用 draw 函数?
类似于以下示例的内容(将根据您使用的 promise lib 而变化)——也不能保证示例中没有任何语法错误。
function geocodeAsync(addressToConvert) {
return new Promise((resolve, reject) => {
geocoder.geocode( {'address': addressToConvert }, (results, status) => {
if (status == google.maps.GeocoderStatus.OK) {
resolve(results[0].geometry.location);
}
else {
reject(status);
}
});
});
}
let loc = locationsToConvert[i];
var promise = geocodeAsync(loc)
promise.then(result => {
let marker = new google.maps.Marker({
position: {lat: result.lat, lng: result.lng},
map: map,
html: loc[0],
id: i
});
// add marker to google maps
})
.catch(err => console.error(err));
相关文章:
- 如果在'/'执行此函数的途径是可以异步执行此代码
- 通过web驱动程序异步执行Javascript
- 不确定react.js的异步执行时间
- 量角器端到端测试中的异步执行
- 作为参数传递的函数的异步执行
- 如何停止node.js中的异步执行
- ngStorage是否异步执行操作
- 在express应用程序中异步执行res.render
- 异步执行 forEach,就像瀑布一样
- JavaScript代码的异步执行
- 我怎样才能异步执行 JavaScript 代码片段并等待它们的结果
- Nodejs 没有异步执行 promise 函数
- jQuery中嵌套的.each()循环异步执行的问题
- 异步执行 LightSwitch Javascript
- ready()是否异步执行
- 浏览器如何异步执行Javascript和渲染
- 产生异步执行javascript
- 确定异步执行何时完成
- 如何识别回调是同步执行还是异步执行
- 当内部函数异步执行某些操作时,如何从外部函数的回调返回值