Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 15.07.2015, 06:50
Аватар для Lemme
Профессор
Отправить личное сообщение для Lemme Посмотреть профиль Найти все сообщения от Lemme
 
Регистрация: 15.07.2015
Сообщений: 511

Область видимости переменной
Почему не записывает данные в переменную data в success?
Внутри этой функции все ок, но
SomeClass.prototype.foo = function(id){
	var data = false;
	ajax({
		method: 'POST',
		url: 'test.php',
		params: 'id='+id,
		success: function(response){
			data = response; // ответ получен
		}
	});
	return data;
}

пробовал и так:
var data = function(response){
		return response;
	}
	ajax({
		method: 'POST',
		url: 'test.php',
		params: 'id='+id,
		success: data
	});
	return data();


Но это работает

function foo(obj){
			obj.test('Hello, World');
		}
		function bar(){
			var data;
			foo({
				test: function(response){
					data = response;
				}
			})
			return data;
		}
		console.log(bar()); //hello world


Извиняюсь, спойлера не нашел, поэтому скидываю (на всякий случай) обертку для Ajax.
function ajax(setting){
	setting.method = setting.method === undefined ? 'GET' : setting.method;
	setting.params = setting.params === undefined ? null : setting.params;

	if (setting.url === undefined || typeof setting.success !== 'function' || (setting.method === 'POST' && setting.params === null)) return false;

	var xmlhttp,
		send = setting.method === 'GET' ? null : setting.params,
		url = setting.method === 'GET' ? setting.url + setting.params : setting.url;
	try{
		xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
	} catch (e){
		try {
			xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
		} catch (E) {
			xmlhttp = false;
		}
	}
	if (!xmlhttp && typeof XMLHttpRequest !== 'undefined'){
		xmlhttp = new XMLHttpRequest();
	}
	xmlhttp.open(setting.method, url, true);
	if (setting.method === 'POST'){
		xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
	}
	xmlhttp.onreadystatechange = function(){
		if (xmlhttp.readyState == 4){
			if (xmlhttp.status == 200){
				setting.success(xmlhttp.responseText);
			}
		}
	}
	xmlhttp.send(send);
}

Вопрос возможно банальный, но...

Последний раз редактировалось Lemme, 15.07.2015 в 07:14.
Ответить с цитированием
  #2 (permalink)  
Старый 15.07.2015, 07:30
Аватар для Safort
Профессор
Отправить личное сообщение для Safort Посмотреть профиль Найти все сообщения от Safort
 
Регистрация: 23.12.2013
Сообщений: 1,856

Цитата:
Почему не записывает данные в переменную data в success?
Внутри этой функции все ок, но
Потому что это асинхронная операция, а не последовательная. Прочитай по подробнее про AJAX или воспользуйся поиском по форуму, тут такой вопрос постоянно задают.
Ответить с цитированием
  #3 (permalink)  
Старый 15.07.2015, 07:43
Аватар для Lemme
Профессор
Отправить личное сообщение для Lemme Посмотреть профиль Найти все сообщения от Lemme
 
Регистрация: 15.07.2015
Сообщений: 511

Safort, спасибо, запомнил

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

Последний раз редактировалось Lemme, 15.07.2015 в 08:05.
Ответить с цитированием
  #4 (permalink)  
Старый 15.07.2015, 13:29
Аватар для Erolast
Профессор
Отправить личное сообщение для Erolast Посмотреть профиль Найти все сообщения от Erolast
 
Регистрация: 24.09.2013
Сообщений: 1,436

Lemme, не обращай на него внимания, это местный цепной тролль)

С асинхронными функциями в JS работают с помощью коллбеков (система замыканий тут очень в тему):
SomeClass.prototype.foo = function(id, onSuccess) {
    ajax({
        method: 'POST',
        url: 'test.php',
        params: 'id='+id,
        success: onSuccess
    });
}

var instance = new SomeClass();
instance.foo(10, function(response) {
    console.log(response);
});


Если хочешь упрощения кода - посмотри в сторону Promise из ES6 (это новейшая спецификация языка, только месяц назад релизнулась), с ними код будет выглядить так:
SomeClass.prototype.foo = function(id) {
    return ajax({
        method: 'POST',
        url: 'test.php',
        params: 'id=' + id,
        success: onSuccess
    });
}

var instance = new SomeClass();
instance.foo(10).then(function(response) {
    
});

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

Последний раз редактировалось Erolast, 15.07.2015 в 20:00.
Ответить с цитированием
  #5 (permalink)  
Старый 15.07.2015, 14:03
Аватар для Makarov
Профессор
Отправить личное сообщение для Makarov Посмотреть профиль Найти все сообщения от Makarov
 
Регистрация: 08.07.2013
Сообщений: 212

Добавлю к ответу Erolast что релизация промисов есть в том же jQuery
Ответить с цитированием
  #6 (permalink)  
Старый 15.07.2015, 14:19
Аватар для Lemme
Профессор
Отправить личное сообщение для Lemme Посмотреть профиль Найти все сообщения от Lemme
 
Регистрация: 15.07.2015
Сообщений: 511

Erolast, спасибо, буду разбираться с этим. А насчет этого тролля.... Я ему уже все сказал=)
Makarov, да мне это не для реального проекта, а для обучения. Соответственно, не использую никаких библиотек/фреймворков.

Последний раз редактировалось Lemme, 15.07.2015 в 14:26.
Ответить с цитированием
  #7 (permalink)  
Старый 15.07.2015, 14:36
Аватар для Erolast
Профессор
Отправить личное сообщение для Erolast Посмотреть профиль Найти все сообщения от Erolast
 
Регистрация: 24.09.2013
Сообщений: 1,436

Раз обучаешься - тогда и в остальные фичи ES6 углубись, там очень много вкусного, в том числе и высокоуровневый синтаксис объявления классов.

Последний раз редактировалось Erolast, 15.07.2015 в 14:40.
Ответить с цитированием
  #8 (permalink)  
Старый 15.07.2015, 14:51
Аватар для Lemme
Профессор
Отправить личное сообщение для Lemme Посмотреть профиль Найти все сообщения от Lemme
 
Регистрация: 15.07.2015
Сообщений: 511

Erolast, ага, я уже читал о ES6, но не думал, что данная спецификация уже используется.
Ответить с цитированием
  #9 (permalink)  
Старый 15.07.2015, 15:02
Аватар для Erolast
Профессор
Отправить личное сообщение для Erolast Посмотреть профиль Найти все сообщения от Erolast
 
Регистрация: 24.09.2013
Сообщений: 1,436

ES6 используется уже как несколько лет, сейчас просто утвердился стандарт.
Ответить с цитированием
  #10 (permalink)  
Старый 15.07.2015, 15:20
Аватар для Lemme
Профессор
Отправить личное сообщение для Lemme Посмотреть профиль Найти все сообщения от Lemme
 
Регистрация: 15.07.2015
Сообщений: 511

Erolast, я в js начал углубляться совсем недавно, поэтому для меня все в новинку. Раньше использовал. jQuery и то по мелочам=)
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите пож с JSON, передача id ссылки. wisma jQuery 22 10.02.2014 15:36
Область видимости переменной jquery Prazdnic Общие вопросы Javascript 7 04.01.2013 19:17
Область видимости переменной в Javascript dadli Общие вопросы Javascript 8 29.01.2012 17:39
Область видимости переменной! Kotakota Events/DOM/Window 7 27.07.2011 13:37
Область видимости переменной. noumo Events/DOM/Window 3 03.12.2009 23:48