2017-01-24 3 views
0

на основе кода ниже, я хочу понять, почему я не могу назвать данные из json (json.projects[i].projName), когда я вызываю его из функции ajax?Не удается передать данные json функции Ajax

var json = JSON.parse(data); 

for (var i = 0; i < json.projects.length; i++) { 

alert(json.projects[i].projName); //will show correct data 

    $.ajax({ url: epridlist, method: 'GET'}).then(function (datas) { 
     alert(json.projects[i].projName) // this will fail. says not know projName, when projName existed in jason data 
    }); 
} 

Пожалуйста, помогите мне разобраться. если я предупрежу о внешней функции ajax, результат покажет

+0

Я откатил ваш вопрос, потому что ваше редактирование недействило существующие ответы. Если ответ ответил на ваш вопрос, примите его. Если у вас есть последующие вопросы, задайте новый вопрос. –

+0

Я прочитал сообщение, и я не могу связать его с моим кодом. мои данные взяты из json-массива, а пример - только число i. Какое отношение? это так расстраивает – silentHijab

+0

в вашем редактировании ... вы сказали, что ваша проблема решена, и у вас возникла новая проблема после добавления нового внутреннего цикла, это другое. Из того, что я видел, прежде чем откатываться назад, это было совершенно не связано с вашей исходной проблемой, потому что вы правильно использовали 'let', чтобы избежать проблемы с циклом закрытия. [Новая проблема] (http://stackoverflow.com/posts/41835949/revisions), вероятно, случай передачи неверных данных. –

ответ

1

Это из-за закрытия. Внутренняя функция в обратном вызове Ajax-эффекта создает закрытие и фиксируется значение переменной i. Внутренняя функция содержит ссылку на переменную i.

После цикл выполняется, значение i будет json.projects.length и при попытке получить доступ к json.projects[json.projects.length] вы получите undefined.

Для решения проблемы попробуйте использовать переменную let вместо var, которая имеет меньшую область действия по сравнению с областью действия.

Вы можете обратиться к другим подходам в этом вопросе: JavaScript closure inside loops – simple practical example

вар = JSON.parse JSON (данные);

for (let i = 0; i < json.projects.length; i++) { 

alert(json.projects[i].projName); //will show correct data 

    $.ajax({ url: epridlist, method: 'GET'}).then(function (datas) { 
     alert(json.projects[i].projName) // this will fail. says not know projName, when projName existed in jason data 
    }); 
} 
+0

Спасибо. Я очень ценю ваш ответ. Можете ли вы мне предложить, как я могу получить доступ к данным из (json.projects [i] .projName) внутри Ajax? – silentHijab

+0

Он работает очень хорошо сейчас ... Спасибо alot :) – silentHijab

+0

Привет Агало, цикл работает гладко сначала, но когда я добавляю еще один цикл внутри, он возвращает значение undefine – silentHijab

Смежные вопросы