#javascript #jquery #ajax #post #get
Проблема в следующем надо AJAX запросом создать документ, потом открыть документ по id который был присвоен в первом запросе. Но дело в том что запрос происходит слишком быстро и данные не успевают сохраниться и вывод файла соответственно не получается сделать, пробывал setTimeout и setInterval, но тогда при втором запросе не находит id который был присвоен в первом. Как сделать небольшой интервал между первым и вторым запросом и что бы id оставалось во втором запросе ?
Ответы
Ответ 1
Было бы логичнее сделать задержку на сервере и возвращать ответ только после записи в файл. На клиенте стОит воспользоваться промисами. Например сделать так: $('a.save').click(function call() { var text = $("#text").val(); $.ajax({ //Тут присваиваем id type: 'POST', dataType: 'json', url: 'http://site.ru/document/?text=' + text }).then(function(jsondata) { // тут создаем задержку в 500мс var defer = $.Deferred(); setTimeout(function() { defer.resolve(jsondata); }, 500); return defer.promise(); }, function() { // показываем 'ошибка' если неудачно выполнен первый запрос $('.results').html('ошибка'); }).then(function(jsondata) { // выполняется второй запрос id = jsondata.id; return $.ajax({ type: 'GET', dataType: 'json', url: 'http://site.ru/document/' + id }) }).then(function(jsondata) { // выполняется после удачного второго запроса var stdout = jsondata.stdout; console.log(stdout); }, function() { // показываем 'ошибка' если неудачно выполнен второй запрос $('.results').html('ошибка'); }); }); И, кстати, вместо error: $('.results').html('ошибка'), cтоило написать хотя бы error: function() { $('.results').html('ошибка'); }, иначе "ошибки" будут показаны в момент отправки запроса.Ответ 2
Как ответили выше используйте промисы. Вот отличная статейка, советую уделить внимание "чейнингу" тут // сделать запрос $.get('https://learn.javascript.ru/article/promise/user.json') // 1. Получить данные о пользователе в JSON и передать дальше .then(response => { console.log(response); let user = JSON.parse(response); return user; }) // 2. Получить информацию с github .then(user => { console.log(user); return httpGet(`https://api.github.com/users/${user.name}`); }) // 3. Вывести аватар на 3 секунды (можно с анимацией) .then(githubUser => { console.log(githubUser); githubUser = JSON.parse(githubUser); let img = new Image(); img.src = githubUser.avatar_url; img.className = "promise-avatar-example"; document.body.appendChild(img); setTimeout(() => img.remove(), 3000); // (*) }); При чейнинге, то есть последовательных вызовах .then…then…then, в каждый следующий then переходит результат от предыдущего.