javascript更改对象';把你的财产还给我

javascript更改对象';把你的财产还给我,javascript,asynchronous,callback,Javascript,Asynchronous,Callback,我必须更改对象的属性并保留所有其他属性。更改后,我需要将对象推入数组。但是,由于异步问题(这是我的猜测),推送的值仍然是初始对象。我怎样才能解决这个问题?这是我的密码: layer.features.forEach(function(feature){ var geometry = feature.geometry; var igeometry = geometry.transform("EPSG:4326"); feature.geometry = igeometry; myF

我必须更改对象的属性并保留所有其他属性。更改后,我需要将对象推入数组。但是,由于异步问题(这是我的猜测),推送的值仍然是初始对象。我怎样才能解决这个问题?这是我的密码:

layer.features.forEach(function(feature){
  var geometry = feature.geometry;
  var igeometry = geometry.transform("EPSG:4326");
  feature.geometry = igeometry;
  myFeature.push(feature);
});

在代码中,推送到myFeature[]中的特征始终是带有几何图形的初始特征,而不是带有igeometry的新特征。

您应该尝试登录到控制台geometry、igeometry和feature,并确保它们都是您期望的值。从你的代码来看,它应该是有效的。比如说。

对于你的承诺,你有几个选择。您可以在promise中解决它,也可以使用新的wait方法来做同样的事情

http.get('someGetAddres').then(result => {
var myFeature = [];
layer.features.forEach(function(feature){
        var geometry = feature.geometry;
        var igeometry = geometry.transform("EPSG:4326");
        feature.geometry = igeometry;
        myFeature.push(feature);
    });
});

async function getFeature() {
    var layer = await http.get('myWebsite');
    var myFeature = [];
    layer.features.forEach(function(feature){
        var geometry = feature.geometry;
        var igeometry = geometry.transform("EPSG:4326");
        feature.geometry = igeometry;
        myFeature.push(feature);
    });
}

您在哪里访问myFeature?问题是。myFeature是必须输出的输出对象的属性。没有函数将其用作输入@Jonaswreplace myFeature.push(功能);使用“console.log(feature)”并验证它是否正确,我不认为问题在于异步调用没有问题。你的代码工作正常。。。(如果feature.geometry是可写的…)代码只能在geoserver脚本环境中运行,这不允许我对console.log进行任何操作。这就是为什么我不能调试它。为什么没有异步调用问题?geometry.transform需要一些时间。在完成之前,该功能已被推入myFeature。我认为这个逻辑是有道理的。根据一些评论,我想问题可能是由feature.geometry只读引起的。他们没有API中的规范。代码只能在geoserver脚本环境中运行,这不允许我控制台.log()。您能解释一下为什么我的代码中没有异步问题吗?在您给出的示例中,最终结果是[2,3,4,5],这是预期的结果。但是,在我为item.a=item.a+1添加了3秒超时后,异步问题就出现了。结果是[1,2,3,4]。在我的代码中,geometry.transform是一个长时间调用,存在异步问题。那么geometry.transform是一个异步函数吗?在这种情况下,使用“全部承诺”。不,不是。我相信这个功能确实起作用了。但我仍然对异步的机制感到好奇。你能解释一下我在评论中提到的问题吗?该函数不是异步的。当我添加超时时,异步问题就存在了。为什么?如果您的代码包含同步和异步代码的组合。然后,您需要注意如何编写代码,以便按照您想要的顺序调用代码。在你做出有价值的事情之前,承诺需要先解决。参见示例
http.get('someGetAddres').then(result => {
var myFeature = [];
layer.features.forEach(function(feature){
        var geometry = feature.geometry;
        var igeometry = geometry.transform("EPSG:4326");
        feature.geometry = igeometry;
        myFeature.push(feature);
    });
});

async function getFeature() {
    var layer = await http.get('myWebsite');
    var myFeature = [];
    layer.features.forEach(function(feature){
        var geometry = feature.geometry;
        var igeometry = geometry.transform("EPSG:4326");
        feature.geometry = igeometry;
        myFeature.push(feature);
    });
}