Я новичок в терминологии и кодировании в целом, но я попытался урезать свой код, хотя в нем все еще могут быть избыточности. Заранее благодарим за понимание.
Я использую сценарий ajax и php для записи некоторых данных в файл на сервере с именем data.json. Скрипт работает нормально, и открытие файла json показывает, что он действительно обновлен данными. Файл json просто содержит массив объектов.
Вот код, который это делает:
function writeData() {
$.ajax({
type : "POST",
url : "save.php",
async : true,
data : {
json : JSON.stringify(dataToWrite)
}
});
document.getElementById('success-box').innerHTML = "Data successfully written.";
};
... и PHP:
<?php
$json = $_POST['json'];
$file = fopen('data.json','w+');
fwrite($file, $json);
fclose($file);
?>
Проблема, с которой я столкнулся, заключается в следующем: пользователь может перейти на отдельную HTML-страницу и нажать кнопку, чтобы просмотреть данные в файле json в красиво оформленном виде. Это делается с помощью другого сценария ajax, который считывает данные. Этот последний сценарий ajax, похоже, не может «видеть» недавно обновленный файл json. Вместо этого он загружает старую версию файла до того, как она была обновлена первым скриптом ajax. Я уверен, что этот второй сценарий ajax запускается после того, как вышеупомянутый writeData() завершен, потому что он фактически полностью находится на отдельной HTML-странице, которая загружается позже, после того, как пользователь нажимает кнопку.
Вот второй сценарий ajax, который считывает данные из файла data.json (он находится на другой отдельной HTML-странице):
$.ajax({
type : "GET",
url : "http://eslquiz.net/ell_errors/data.json",
async : true,
dataType : 'json',
success : function(response) {
data = response;
document.getElementById('main').innerHTML = `
<div id='top-stuff'>
<button onClick='viewData()'>Reset Filter</button>
<button onclick = "print2()">Print Worksheet</button>
</div>
<br>
<div id='left-column' class='column'></div>
<div id='right-column' class='column'></div>
`;
leftColumn = document.getElementById('left-column');
rightColumn = document.getElementById('right-column');
leftColumn.innerHTML = "<b>Sentences:</b> <br><br>";
rightColumn.innerHTML = "<b>Errors:</b> <br><br>";
//add the sentences and their errorTypes:
for (i=0; i<data.length; i++) {
var senBox = document.createElement('div');
senBox.className = 'box';
senBox.setAttribute('id', 'sen' + i)
senBox.innerHTML += data[i].text;
var errBox = document.createElement('div');
errBox.className = 'box';
errBox.setAttribute('id', 'err' + i)
errBox.innerHTML += data[i].errorType;
leftColumn.appendChild(senBox);
rightColumn.appendChild(errBox);
}
}
});
Все эти файлы хранятся в одном каталоге на One.com.
Странно то, что когда я вручную открываю файл data.json и редактирую его содержимое любым способом (например, удаляя все), при следующем вызове ajax он считывает версию, которую я только что обновил вручную. Это заставляет меня думать, что это может быть связано с самим обновлением сервера One.com?
Я попытался настроить ajax между синхронным / асинхронным и использованием cache: false, но это, похоже, ни на что не влияет.
Я искал вокруг и, кажется, не могу понять, что здесь происходит. Спасибо за любые советы, которые вы могли дать.
Спасибо. Второй ajax фактически находится на отдельной HTML-странице, чтобы избежать проблем с запуском до завершения writeData (). Пользователь переходит на эту вторую HTML-страницу только после добавления данных с помощью первого ajax. Обновленный вопрос, чтобы упомянуть об этом.
это, возможно, стоит прочитать / попробовать: stackoverflow.com/questions/33390424/…
в качестве теста я бы попытался обслужить этот json через php-скрипт. Либо только для проверки того, откуда исходит проблема, либо в качестве окончательного решения (которое также даст вам возможность Спрятать, что data.json от незарегистрированных пользователей)
примечание: онлайн data.json прямо сейчас не json, поэтому выдает ошибку на data.length



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Во-первых, браузер может кэшировать метод GET.
во-вторых, убедитесь, что ответ относится к типу json.
$.ajax({
type : "GET",
url : "http://eslquiz.net/ell_errors/data.json?rand_v = " + Matn.random(), // add a random try again
async : true,
dataType : 'json',
success : function(response) {
// Make sure the response is a json type
// console.info(typeof(response));
// console.info(typeof(JSON.parse(response)));
data = response;
// ...
Спасибо. В итоге я использовал следующее:
jQuery.ajaxSetup({
cache: false
});
Я пробовал использовать это раньше, но по какой-то причине это не сработало, не знаю почему. Но теперь он работает! Спасибо.
Возможно, вы вызываете второй ajax до завершения
writeData()ajax? Показать больше контекста кода