JavaScript:无法从json中的API添加字符串
当我添加值时,通常会将其添加到json中: 代码: 错误:JavaScript:无法从json中的API添加字符串,javascript,Javascript,当我添加值时,通常会将其添加到json中: 代码: 错误: 有人能告诉我我缺少什么吗?将var k更改为let k k在循环的每次迭代中递增,其最终值将是result.length,循环在该点停止 循环首先运行result.length次,每次递增k,然后使用$.ajax启动所有这些请求。注意,您只能在这里启动它们,因为它们是异步的!这意味着,它们完成并调用success的时间将在稍后,同时代码的其余部分将继续运行 因此,稍后,请求完成,并尝试访问result[k]。但是,此时,k===res
有人能告诉我我缺少什么吗?将
var k
更改为let k
k
在循环的每次迭代中递增,其最终值将是result.length
,循环在该点停止
循环首先运行result.length
次,每次递增k
,然后使用$.ajax
启动所有这些请求。注意,您只能在这里启动它们,因为它们是异步的!这意味着,它们完成并调用success
的时间将在稍后,同时代码的其余部分将继续运行
因此,稍后,请求完成,并尝试访问result[k]
。但是,此时,k===result.length
(因为循环已经运行了很长时间),因此result[k]
将是未定义的
使用let
可以利用ES6中的一个特殊功能,其中let
变量在for
语句中实际创建变量的两个实例,第一个实例实际计数,第二个实例重新初始化为第一个实例的当前值,并可用于内部范围(但将其值保留在闭包中)。这是一种简化,但底线是这样,循环的每个迭代都将有自己的k
,即使在循环前进之后,它也会保持其值
注意:您的url
目前看起来是静态的,但是如果它在某一点上依赖于k
,那么它也应该是let
,否则您也会遇到同样的问题
例如,如果不能使用ES6,另一种方法是使用IIFE(立即执行的函数表达式)创建一个新的(函数)作用域,将变量作为参数传递到其中:
for(var k=0;k
或者,您可以使用forEach
(它接受回调,因此每次都会自动有一个新变量)。使用let
:for(让k=0;k
您的操作是Asynchronous
@cybercoder,这不是问题所在。@hev1是的,当您使用var
时,k
是上层作用域的k
。当操作是Asynchronous时,k
超出预期。@cybercoder固有问题的性质不一定是由于异步操作造成的口粮。感谢您的回答,错误已消失,但我的json即结果
未得到更新。它不接受结果[k][“发件人”]的值
对此有什么建议吗?也许你在请求完成之前阅读了值?我看不到你的代码中有任何地方在等待它。看,我在问题中添加了api。你能帮我在哪里添加wait
?不,整个代码需要重新构造(代码中依赖于异步检索的值的所有内容,即调用此代码的代码,等等)。请阅读我链接的问题及其答案,并完全理解它。您需要学习异步编程,恐怕您不能只是“添加等待”。。。
for (var k = 0; k < result.length; k++) {
result[k]["sender"] = k;
}
for (var k = 0; k < result.length; k++) {
var url = "//api";
$.ajax({
url: "https://reverse.geocoder.api.here.com/6.2/reversegeocode.json?prox="+result[k]['lat'].toString()+","+result[k]['lon']+"&mode=retrieveAddresses&app_id=***&app_code=***",
context: document.body,
success: function (data) {
console.log(k, typeof data['Response']['View'][0]['Result'][0]['Location']['Address']['Label']);
result[k]["sender"] = data['Response']['View'][0]['Result'][0]['Location']['Address']['Label'];
}
});
}