Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/443.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript:无法从json中的API添加字符串_Javascript - Fatal编程技术网

JavaScript:无法从json中的API添加字符串

JavaScript:无法从json中的API添加字符串,javascript,Javascript,当我添加值时,通常会将其添加到json中: 代码: 错误: 有人能告诉我我缺少什么吗?将var k更改为let k k在循环的每次迭代中递增,其最终值将是result.length,循环在该点停止 循环首先运行result.length次,每次递增k,然后使用$.ajax启动所有这些请求。注意,您只能在这里启动它们,因为它们是异步的!这意味着,它们完成并调用success的时间将在稍后,同时代码的其余部分将继续运行 因此,稍后,请求完成,并尝试访问result[k]。但是,此时,k===res

当我添加值时,通常会将其添加到json中:

代码:

错误:


有人能告诉我我缺少什么吗?

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'];
        }
    });
}