Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Синхронный запрос возвращает NULL, почему?

Здравствуйте, начал делать лабу курса Специалист AJAX, но запрос не работает у меня - в видосе то у них все ок. Может Денвер нужно как-то спецом настроить?

Windows 8.1, Denwer 3 (PHP 5.3.13, MySQL 5.1, PostgreSQL 8.4 etc.) - я его просто установил, запустил и все.

Браузеры говорят "req is NULL", IE говорит:


Функция getXMLHttpRequest в отдельный файл вынесена, файл подключен нормально консоль говорит.

function getXmlHttpRequest(){
	if(window.XmlHttpRequest){
		try{return new XmlHttpRequest();}
		catch(e){}
	}else if(window.ActiveXObject){
		try{return new ActiveXObject("Msxml2.XMLHTTP");}
		catch(e){}
		try{return new ActiveXObject("Microsoft.XMLHTTP");}
		catch(e){}
	}
	return null;
}


Вот сам код:

// URL сценария, возвращающего время
		var url = "gettime.php?delay=3";		// Задержка в запросе:  gettime.php?delay=3
		var req = getXmlHttpRequest();


		// Синхронный запрос
		function showSyncRequest(){
			// Запрос
			req.open(GET, url, false);
			req.send(null);
			// Вывод ответа
			var res = document.getElementById("syncResult");
			res.firstChild.nodeValue = req.responseText;
		}


HTML

<h1>Синхронные и асинхронные запросы</h1>
	<div id="sync">
		<h2>Синхронный запрос</h2>
		<div id="syncResult" class="result">Здесь будет время</div>
		<button onclick="showSyncRequest()">Пробуем!</button>
	</div>


Ну и на всякий случай сам пхп.
<?php
/*
** Сценарий возвращает текущее время
*/

// Установка типа данных и кодировки
header("Content-type", "text/plain; charset=utf-8");

// Чтение параметра задержки и задержка в коде
if (isset($_GET["delay"])){
	$delay = abs((int) $_GET["delay"]);
	$currTime = time();
	while (time() < $currTime + $delay) {}
}

// Текущее время
echo date("H:i:s");
?>
Ответ: Может быть, я же говорю, что даже не вникал в это, ибо нафик это надо.
Вопрос: Ошибка синхронного запроса

Здравствуйте! У меня на странице выводятся из бд все записи. Теперь я хочу сделать сортировку этих записей по категориям. Т.е., выбираю из выпадающего списка вторую категорию, выводятся записи, относящиеся к ней. Я хочу чтобы это происходило без обновления страницы. Т.е., я создаю в index.php <div id="content"></div>, затем в скрипте передаю полученные данные через $("#content").html(msg);. В итоге у меня возникает ошибка синхронного запроса.
Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check .
В чем может быть дело?
Ответ: (((
Вопрос: Синхронные запросы

Добрый вечер! Кто знает как "убить" синхронные запросы? У меня в консоли выходит сообщение что у меня данные передаются сихронно

Добавлено через 38 секунд
Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check .
Ответ: Спасибо!!! Получилось
Вопрос: Синхронный запрос к серверу, отображение ответов

Доброго дня. Подскажите как сделать вывод ответов сервера по мере их поступления без перезагрузки.?
Делаю запрос к серверу. Получаю сразу весь готовый ответ на страницу.
а надо так:
пришел ответ- отобразился,
пришел новый- добавился в отображении,
пришел новый- добавился в отображении.
то есть чтобы было видно процесс.

index.html
HTML5
1
2
3
4
5
6
7
  <body>
    <p>Введите число и нажмите на кнопку "Получить...".</p> 
    <input id="nameUser" type="text" placeholder="Введите число">
    <input id="button" type="button" value="Получить ответ с сервера">
    <p>Ответ (AJAX): <span id="answer"></span></p>
    <script src="script.js"></script>
  </body>
script.js
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
var button = document.getElementById("button");
button.addEventListener("click",function() {
  var request = new XMLHttpRequest();
  var params = 'name=' + encodeURIComponent(document.getElementById("nameUser").value);
  request.open('POST','upload.php',false);
  request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
  request.send(params);
  if (request.status==200) {
    console.log(request.responseText);
    document.getElementById("answer").innerHTML = request.responseText;
  } 
})
upload.php
PHP
1
2
3
4
5
6
7
8
9
10
11
12
<?php
if (isset($_POST['name'])) {
  $name = $_POST['name'];
  for ($i=0 ;$i < $name;$i++) 
    {
    $name = $name-$i;
    $i=$i+1;
        echo $name.'<br>';
        sleep(1);
        }
}     
?>
После какой то паузы (работы сервера), отображается сразу весь готовый ответ, а надо чтобы каждая строка добавлялась пестепенно, по мере получения ответа.
Ответ:
Сообщение от Уф
как я понял твой вопрос отностся к предыдущей теме, отображение процесса загрузки фоток вконтакте,
в той теме я видимо сильно намудрил с описанием. не каждый будет читать мои рукописи. Я понял что нужно зайти с простого примера, чтобы самому разобраться с технологией. нужно каждый файл отображать.
Примерно начинаю понимать смысл.
буду из js скрипта отправлять get запросы по каждому файлу, получать ответы и отображать.

Пожалуйста подскажите как js скрипту передать массив данных, чтобы он его перебирал (в php делаю sql запрос, присваиваю переменной полученный массив). как эту переменную обрабатывать в js?
Вопрос: Синхронный AJAX в Crome

Уважаемые спецы по JS. Помогите решить проблему.

Делал кусок веб-приложения, сугубо бэкендного характера (импорт огромных XML-файлов, около 1Гб). Чтобы сервак не отправлялся в аут по максимальной времени работы скрипта и памяти, сам процесс разбил на куски и вызываю каждый кусок из браузера при помощи AJAX и в ответ отображаю процесс (прогрессбар) довольному пользователю.

Что сделал. перевел $.ajax в синхронный режим async=false и пожалуйста! Работает как часики. Все мои этапы работы аккуратно один за одним запускаются.

Всё настроил и отладил, работает как рояль в Большом театре, но начали тестить манагеры и тут выяснилось, что браузеру Google Crome (на котором сидит 90% манагеров) async=false до одного места. Он все равно выполняет все $.ajax, $.get, $.post АСИНХРОННО (выкинув в консоль сообщение про "ай-я-яй, так нельзя... depricated ... и т.д."). И в итоге все мои наработки летят тоже в одно место.

Причем я и раньше знал об этой особенности Хрома, но т.к. сам Лисовод ярый - что то спустил это на тормозах.

Так вот, когда просто идет серия AJAX запросов подряд, то проблем нет делаю примерно так

$.ajax({ type: "GET",url:'/test/import', data: "cmd=categories_load" , dataType:'json'})
            .then( function(result) {
               
                //.. делаем чтото ...
                
                $.ajax({type: "GET", url: '/test/import', data: "cmd=categories_import", dataType:'json'})
                .then(function(result) {
                         //.. делаем чтото ...

ну и т.д.


Тут какбе всё просто (это я просто уже в процессе переписал на deffered objects, хотя конечно можно было и просто слушать события onSuccess и т.д. не суть...) тут всё нормально работает одно за другим - статика есть статика.

Но пара ajax-запросов у меня вызываются динамически в зависимости от условий (циклом или рекурсией) вот тут беда...

Вот рекурсивная функция:

 function SlicePacckets(ct,s,all_pack) {
            console.log('Нарезаем SQL-пакеты');
            $.ajax({ type: "GET", url:'/test/import/', data:'cmd=packets&start='+s+'&numpack='+all_pack, dataType:'json'}).then(
                 function(msg){
                 console.log(msg);
                  s+=1000;   
                  $('#progress').text(all_pack);
                  $('#progress_to').text(parseInt(ct/1000));
                  all_pack++;
                  if (s<=ct) {
                     SlicePacckets(ct,s,all_pack);
                  }
                }
            );
            console.log('Нарезано');
            
            return all_pack;
}


Вот с ней (и таких несколько) беда... в консоль попадает следующее
1. console.log('Нарезаем SQL-пакеты');
2. console.log('Нарезано');
3. и начинает результаты запроса выводить console.log(msg);

Т.е. я никак не могу гарантировано сказать что эта функция отработала полностью и можно переходить к следующему этапу.

ЧТО БЛИН ТУТ МОЖНО СДЕЛАТЬ? Как заставить аджакс в хроме работать синхронно? Как без всяких дебильных конструкций (типа while с выходом по постусловию) запустить следующий этап работы, после гарантированного окончания текущего?

Помогите! Вопрос уже из области "как блин?", дело чести.

Убедительная просьба:
1) Если знаете какие нибудь плагины или расширения jquery которые умеют синхронные запросы в Crome - приму с дорогой душой, сам ничего не нашел.
2) Личный опыт и лайфхаки - интересны.
3) Если решается при помощи defered objects - напишите плиз примерчик, ибо уже 3-й день копаю в эту сторону.
4) Всякие недоучки, которым по теме сказать нечего кроме, того как объяснить мне что "так вообще нельзя" , "импортировать вообще ничего не надо", "делай через Кронт", "пусть маленькие файлы присылают", "это не твоя работа вообще" - идите ЛЕСОМ! И надеюсь на поддержку модераторов в этом. Вопрос задан конкретно специалистом по JS и людям которым интересна сама задача.
Ответ: Petro123,

а какое это отношение к теме имеет? Как это к проблеме синхронного AJAX в браузере Crome относится?
Вопрос: Вложенные Ajax запросы

Всем доброго времени суток!

Как известно, применение синхронных запросов нежелательно. Но вот что делать, если информацию нужно получить "вложенно". То есть для того, чтобы выдать инфу, нужно сделать последовательные запросы к серверу.

Например (хардкор конечно, но):
var user = {
    country: 1,
    region: 2,
    city: 5
};

Запрос А = запрашиваем пользователя, получаем айди страны, региона, города
Запрос В = запрашиваем страну по айди, получаем айди областей
Запрос С = запрашиваем область по айди, получаем айди городов
Запрос D = запрашиваем город по айди, и получаем наконец название города...

Т.к. используем AJAX (А), то запросы посылаются синхронно с проходом компилятора (К), но К не дожидается пока А вернет что-то. В итоге код вида
var Adress = function(countryId, regionId, cityId){
    var adr = {};
    var gCr = AJAX.getCountries();
    adr.country = gCr[countryId].name;
    var gRg = AJAX.getRegionInCountry(countryId);
    adr.region = gRg[regionId].name;
    var gCt = AJAX.getCityInRegion(regionId);
    adr.city = gCt[cityId].name;
    return adr;
};

var U_adress = new Adress(user.country, user.region, user.city);
var string = "Пользователь проживает по адресу" +  U_adress.country + U_adress.region + U_adress.city;

вообще неуместен, т.к на выходе по понятным причинам получим Польз. пр. по адресу undefined undefined undefined.

При использовании колбеков, которые как раз таки применяются для такого
AJAX.getCountries(function () {
    ///...
    var gRg = AJAX.getRegionInCountry(countryId, function () {
        ///...
        var gCt = AJAX.getCityInRegion(regionId, function () {
            ///...
        })
    })
});

не получается вернуть результат в родительскую ф-цию, не знаю даже почему, наверно, коллбек просто завершает себя в никуда. В итоге на выходе снова получаем Польз. пр. по адресу undefined undefined undefined

Вопрос, уважаемые знатоки: Как заставить этот AJAX сделать вложенные (последовательныe) запросы, когда для одного запроса нужно сделать сначала другой, а для другого сначала третий и т.д ?
Ответ:
Сообщение от Sherminator
сли сервер возвращает объекты
Сданные в эксплуатацию надеюсь? Да кто-то разве против мазохизма? Мазохируй, видимо в этом смысл твоего бытия. Лол.
Вопрос: Асинхронный ajax запрос

Доброго времени суток.
Имеется функция для выполнения ajax запроса.
function ajax(url, callback, async, method, params, header)
    {
        var xmlHttp = getXmlHttpRequest();
        async = async || false;
        params = params || '';
        method = method || 'GET';
        if (method == 'GET') url += '?'+'searchParams=' +params;
        if (header != null) xmlHttp.setRequestHeader('Content-Type', header)
        xmlHttp.open(method, url, async);
        if (!async)
        {
            if (params == '') {
                xmlHttp.send(null);
            }else {
                xmlHttp.send(params);
            }
            callback(xmlHttp.responseText);
        }
        else
        {
            xmlHttp.onreadystatechange = function() {
                if (xmlHttp.readyState == 4) {
                    callback(xmlHttp);
                }
            };
            xmlHttp.send(null);
        }
    }


Так вот, если я делаю синхронный запрос, т.е:
ajax('...',
           function(data){console.log(data)},
                false,
                'POST',
                ...);

а когда делаю асинхронный запрос т.е:
ajax('...',
            function(data){console.log(data)},
                true,
                'POST',
                ...);

то получаю undefined.
Я подозреваю что проблема в моей функции для ajax запроса, гляньте своим опытным глазом и скажите что не так?
Заранее спасибо.
Ответ: Кому интересно, проблема была в том что я забыл передавать заголовки(header).
Вопрос: JS, как подключится к Postgres

скажите как можно подключится к СУБД Postgres прямо с странички в браузере

(СУБД могу настроить как угодно, безопасность и скорость - второстепенная, брузерах - любой популярный (он как интерфейс для управления софтом через БД, напр. как это сделано в роутерах или 3G модемах) )
Ответ: MMM_Corp,

Вопрос: Nodejs обработка данных полученных от postgres

Добрый день.
Как дождаться данных из postgres?
Проблема в том что при попытке получить данные в массив он пишет undefined. Но при этом в console.log выводит корректные данные.

+

function connection_sql(text = 'select now();', values = []){
    row = {};
    const { Pool, Client } = require('pg');

    const client = new Client({
      user: 'cicada',
      host: '192.168.50.17',
      database: 'test',
      password: '123456',
      port: '5432'
    });
    
    //callback 
    client.connect();
    client.query(text, values, (err, res) => {     
       if (err) {
       console.log(err.stack);
     } else {
       row = res.rows;                
       console.log(row);       //выводит то что надо
     }
     client.end();     
    });
    return row;
}


module.exports.get_arr_db = function(){
    let arr = [];
    const text = 'SELECT temp1 FROM public.testdata limit 100;';
    temp = connection_sql(text);    
    arr = temp.temp1;
    console.log("arr = ", arr);  //здесь пустой массив
    return arr;
};


Console.log
arr =  undefined
[ { temp1: 420 },
  { temp1: 423 },
  { temp1: 425 },
  { temp1: 426 },
  { temp1: 428 },
  { temp1: 426 },
...

Ответ: ncux199rus,
Не в ту ветку написал.
Можно удалять.
Вопрос: Get запрос

доброго времени суток )) делаю синхронный запрос к серверу
Код Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
var getTimeUrl = "respond.php?delay=5";
var req;
function showSyncRequest(){
    req = new XMLHttpRequest();
    req.open("GET",getTimeUrl,false);
    req.send(null);
    if(req.status == 200){
    var result = document.getElementById("syncResult");
    result.innerHTML = req.responseText;    
}else{
    console.log(req.status + ":" + req.statusText);
}
    
}
пытаюсь получить ответ так то
Код PHP
1
2
3
4
5
6
7
8
if(isset($_GET['delay'])){
    echo "hello";
    $delay = (int) $_GET['delay'];
    $currTime = time();
    while(time() < $currTime + $delay){}
}
 
echo date("H:i:s");
а в результате в консольке появляется ошибка 500 (Internal Server Error) (сервер апач2 система убунту 14,04 ) помогите разобраться добрые люди

Добавлено через 19 минут
ну пока никто не ответил дополню )) убрал из php заголовок header("Content-type","text/playn";"charset=utf-8"); и воуаля получаю ответ что за магия помогите понять))
Ответ: от зараза а )) спасибо )) так и знал что кот где то близко прячется голову ужу сломал)