gpt4 book ai didi

javascript - 在调用回调之前如何等待异步创建的对象完全可用?

转载 作者:数据小太阳 更新时间:2023-10-29 05:15:00 26 4
gpt4 key购买 nike

我正在尝试创建一个函数来创建一个新标记。我需要能够在回调中处理新标记的一些属性。问题是 marker 立即创建并可用于调用回调,但某些属性尚不可用。

如果我在尝试访问属性之前等待两秒钟,它工作得很好 - 这让我相信对象在创建后仍在异步生成自身。

<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="initial-scale=1.0, user-scalable=no">
<meta charset="utf-8">
<title>Simple markers</title>
<style>
html, body {
height: 100%;
margin: 0;
padding: 0;
}
#map {
height: 100%;
}
</style>
</head>
<body>
<div id="map"></div>
<script>

function initMap() {
var latLng = new google.maps.LatLng(-25.363, 131.044);

var map = new google.maps.Map(document.getElementById('map'), {
zoom: 4,
center: latLng
});

function placeMarker(map, latLng, callback, callback2){
var marker = new google.maps.Marker({
position: latLng,
map: map });

callback(marker);
callback2(marker);
}

placeMarker(map, latLng, function(marker){
setTimeout( function(){
console.log(marker.Xg.Oa)
}, 2000);
}, function(marker){
console.log(marker.Xg.Oa);
});

}
</script>
<script async defer
src="https://maps.googleapis.com/maps/api/js?signed_in=true&callback=initMap"></script>
</body>
</html>

在这个例子中回调:

setTimeout( function(){ 
console.log(marker.Xg.Oa)
}, 2000);

产生正确的响应。但是不等待的回调显示未定义的错误:

function(marker){
console.log(marker.Xg.Oa);
}

我在这里使用的是 Google Maps Javascript API 库,出于显而易见的原因,不能选择乱用 google.maps 内容。我想将整个对象传递给回调,但我需要确保在调用它之前存在经纬度信息 (marker.Xg.Oa)。在调用回调之前如何确保它存在?

最佳答案

注意:我还没有测试过这个,但是沿着这些思路......

var map = //...
var latLng = //...

function placeMarker(map, latLng, callback){

return new Promise(function(resolve, reject)(){

getMarker().then(function(marker){
//The marker is immediately available
console.log(marker); //me {__gm: Object, ... }

//Try to get the value we need
console.log(marker.Xg.Oa); //Uncaught TypeError: Cannot read property 'Oa' of undefined

//wait two seconds and try again
setTimeout(function(){ console.log(marker.Xg.Oa) }, 2000); // L {} (this is the expected output)

while(!marker.Xg.Oa){ //Uncaught TypeError: Cannot read property 'Oa' of undefined
callback(marker.Xg.Oa);
}

resolve(true);
});
});

}

function getMarker()
{
return new Promise(function(resolve, reject){
var marker = new google.maps.Marker({
position: latLng,
map: map
});

resolve(marker);
});
}

关于javascript - 在调用回调之前如何等待异步创建的对象完全可用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33245495/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com