Использование одной и той же переменной в последовательных Ajax функциях - PullRequest
1 голос
/ 07 февраля 2020

У меня есть 2 ajax функций в одном и том же скрипте, и я хочу, чтобы результат первого был собран вторым и отправлен на правильный URL,

Вот мой код:

    <!DOCTYPE html>
    <meta charset="utf-8"/>
    <html>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
        <script>
            $(document).ready(function(){
                $.ajax({
                    url:"TEST_2.csv",
                    dataType:"text",
                    success:function(data)
                    {

                        var lines=data.split("\n");

                        var result = [];

                        // NOTE: If your columns contain commas in their values, you'll need
                        // to deal with those before doing the next step 
                        // (you might convert them to &&& or something, then covert them back later)
                        // jsfiddle showing the issue https://jsfiddle.net/

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

                                var obj = {};
                                var currentline=lines[i].split(",");

                                for(var j=0;j<currentline.length;j++){
                                    obj=currentline[j];
                                }

                                result.push(obj);

                        }

                        //return result; //JavaScript object
                        return result;
                    }
                });
                // Définition des paramètres et des entêtes de la requête avec l'identifiant de la liste dans l'URL
                    var listId = 261291 
                    settings = {
                        "async": true,
                        "crossDomain": true,
                        "url": 'https://www.kizeoforms.com/rest/v3/lists/'+listId,
                        "method": 'PUT',
                        "headers": {
                            'content-type': 'application/json',
                            Authorization: '*****',
                        },
                        // Ajout des données dans le corps de la requête
                        processData: false,
                        data: result,
                    }
                    $.ajax(settings).done(function(response) {
                            console.log(response)
                    })
            });
        </script>
   </html>

Когда я запускаю скрипт в своем браузере, я получаю эту ошибку в консоли: enter image description here

Я не вижу, как передать содержимое переменная «result» в «data» переменной «settings», которую я затем передаю своей второй ajax функции,

Я довольно новичок в ajax, поэтому я могу что-то делать совершенно неправильно вот,

Спасибо,

Ответы [ 2 ]

0 голосов
/ 07 февраля 2020

Я думаю, вы создаете массив из json объектов из вашего CSV-файла в вашем первом блоке кода. Вот более простой, но эффективный способ сделать это:
Исходный ответ здесь: преобразовать строки CSV в Javascript объекты

Функция для чтения файла:

function loadFile(filePath) {
  var result = {};
  var items = null;
  var xmlhttp = new XMLHttpRequest();
  xmlhttp.open("GET", filePath, false);
  xmlhttp.send();
  if (xmlhttp.status==200) {
    items = xmlhttp.responseText;
  }
  result.items = items;
  return result;
}

Ваш первый код будет выглядеть следующим образом:

    var csvString = loadFile("./TEST_2.csv");
    var arr = csvString.split('\n');     

    var items = {};
    var headers = arr[0].split(',');
    for(var i = 1; i < arr.length; i++) {
      var data = arr[i].split(',');
      var obj = {};
      for(var j = 0; j < data.length; j++) {
         obj[headers[j].trim()] = data[j].trim();
      }
      items.push(obj);
    }

    var result = {}
    result.items = items;
    console.log(JSON.stringify(result));

Затем вы можете проверить, правильно ли построен объект, и запустить ajax PUT следующим образом:

if (Array.isArray(result) && result.length) {
  var listId = 261291 
  settings = {
                "async": true,
                "crossDomain": true,
                "url": 'https://www.kizeoforms.com/rest/v3/lists/'+listId,
                "method": 'PUT',
                "headers": {
                  'content-type': 'application/json',
                  Authorization: '*****',
                  },
                processData: false,
                data: result,
               }

   $.ajax(settings).done(function(response) {
     console.log(response)
   });

}

0 голосов
/ 07 февраля 2020

По умолчанию Ajax запускается с async = true. Второй вызов ajax может быть запущен до того, как завершится первый вызов, а результат не имеет значения.

Например, вы можете пометить первый Ajax вызов синхронно, чтобы ожидать заполнения результата

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...