Ajax не получает самую последнюю версию файла JSON

Я новичок в терминологии и кодировании в целом, но я попытался урезать свой код, хотя в нем все еще могут быть избыточности. Заранее благодарим за понимание.

Я использую сценарий 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 до завершения writeData() ajax? Показать больше контекста кода

charlietfl 02.08.2018 23:39

Спасибо. Второй ajax фактически находится на отдельной HTML-странице, чтобы избежать проблем с запуском до завершения writeData (). Пользователь переходит на эту вторую HTML-страницу только после добавления данных с помощью первого ajax. Обновленный вопрос, чтобы упомянуть об этом.

Brendon Albertson 02.08.2018 23:43

это, возможно, стоит прочитать / попробовать: stackoverflow.com/questions/33390424/…

Jeff 02.08.2018 23:53

в качестве теста я бы попытался обслужить этот json через php-скрипт. Либо только для проверки того, откуда исходит проблема, либо в качестве окончательного решения (которое также даст вам возможность Спрятать, что data.json от незарегистрированных пользователей)

Jeff 02.08.2018 23:55

примечание: онлайн data.json прямо сейчас не json, поэтому выдает ошибку на data.length

Jeff 02.08.2018 23:57
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
5
200
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Во-первых, браузер может кэшировать метод 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
});

Я пробовал использовать это раньше, но по какой-то причине это не сработало, не знаю почему. Но теперь он работает! Спасибо.

Другие вопросы по теме