Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 16.06.2011, 04:20
Новичок на форуме
Отправить личное сообщение для Йакуд Посмотреть профиль Найти все сообщения от Йакуд
 
Регистрация: 26.11.2010
Сообщений: 8

Замыкания в JS
Всем привет. У меня появился вопрос. Как можно реализовать такую фичу:
Имеется объект

var User = function(id){
  var then = {};	
  then.id = id;	
  
  /*...*/

  then.getInfo = function(param){
    param.id = then.id;
	
    /* Запрос на сервер */
    $.get(then.phpGet, param, function(data){
      /* Парсим данные */
      var data = JSON.parse(data);
	  
      /* Если ошибка, выводим сообщение */
      if(data.error !== undefined){
        then.showError(data.error);
      }
      else /* Добавляем к основному объекту принятые параметры */
      {
        for(var i in data)
        {
          then[i] = data[i];
        }
        
        /* Ссылку/копию передать отсюда. */
        if(param.End !== undefined && typeof(param.End) == "function"){
          param.End(then);
        }
      }
    });
 }
}


Создается он так вот:
var yakud = new User(UserEnter_id);
yakud.getInfo({
  param: ['nick', 'type'],
  End: function(d){
    //alert(d)
  }
});


Все дело в том, что мне нужно вот сюда
End: function(d){
    //alert(d)
}

Передать ссылку или копию объекта then с полученными параметрами.
Как это можно реализовать? Прочитал статью на сайте про замыкания и, честно говоря, мало чего понял.
Буду очень благодарен за помощь.
Ответить с цитированием
  #2 (permalink)  
Старый 16.06.2011, 05:07
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

В место then использовать this?
Ответить с цитированием
  #3 (permalink)  
Старый 16.06.2011, 13:25
Новичок на форуме
Отправить личное сообщение для Йакуд Посмотреть профиль Найти все сообщения от Йакуд
 
Регистрация: 26.11.2010
Сообщений: 8

Собственно, какая разница-то? Объект then у меня создается и в дальнейшем используется он. Тут все в норме.
На самом деле, все само заработало =___=. Но теперь одна ошибочка есть. Функция End вызывается как-будто два раза. Первый раз аргумент undefined, а второй раз возвращает то, что нужно.
Приходится делать проверку на undefined вот в этом месте
End: function(d){ 
  if(d !== undefined)
    alert(d) 
}

Но это не очень красиво. Как можно избежать этой проверки? Да и вообще, почему функция, может вызываться два раза? Хотя вызываю я ее точно один! Я проверял уже.
Ответить с цитированием
  #4 (permalink)  
Старый 16.06.2011, 13:42
Аватар для Nekromancer
Профессор
Отправить личное сообщение для Nekromancer Посмотреть профиль Найти все сообщения от Nekromancer
 
Регистрация: 06.05.2009
Сообщений: 1,163

Сообщение от Йакуд Посмотреть сообщение
Собственно, какая разница-то? Объект then у меня создается и в дальнейшем используется он. Тут все в норме.
Не в норме, вы плодите много лишних объектов.

Про 2 раза не знаем, весь код не видели, мало ли чего вы намудрили.
__________________
Нужно равняться на лучших, а не оправдываться за счёт худших.
Ответить с цитированием
  #5 (permalink)  
Старый 16.06.2011, 13:52
Новичок на форуме
Отправить личное сообщение для Йакуд Посмотреть профиль Найти все сообщения от Йакуд
 
Регистрация: 26.11.2010
Сообщений: 8

Лишний объект создал из-за того, что буду обращаться из объекта jQuery, а там this уже имеется. Это для своего удобства. Мне кажется, что лишний объект не сильно повлияет на быстродействие.
Цитата:
Про 2 раза не знаем, весь код не видели, мало ли чего вы намудрили.
Это и есть весь код, только без функции вывода ошибки и без инициализации нужных переменных. Но если на то пошло, то вот класс:
var User = function(id){
  var then = {};	
  then.id = id;	
	
  /* Основные переменные */
  then.phpGet = "./model/gb/js/user/user.php";
  then.errorMessage = {
    0: "Вы не имеете доступа к разделу!"
  };
  
  /* Получение информации о пользователе */
  then.getInfo = function(param){
	param.id = then.id;
	
	/* Запрос на сервер */
    $.get(then.phpGet, param, function(data){
	  /* Парсим данные */
	  var data = JSON.parse(data);
	  
	  /* Если ошибка, выводим сообщение */
	  if(data.error !== undefined){
	    then.showError(data.error);
	  }
	  else /* Добавляем к основному объекту принятые параметры */
	  {
	    for(var i in data)
		  then[i] = data[i];

		if(param.onComplete !== undefined && typeof(param.onComplete) == "function")
		   then.End(then);
	  }
	});
  }
  
  /* Функция вывода ошибки */
  then.showError = function(error_id){
    alert("Ошибка №" + parseInt(error_id+1) + "! " + then.errorMessage[error_id]);
  };
  
  return then;
};

Вот создание объекта:
var UserEnter_id = 1;

var yakud = new User(UserEnter_id);
yakud.getInfo({
  param :['nick', 'type'],
  End   :function(d){
    if(d !== undefined)
      alert(d)
  }
});

Вот так вот работает, а без
if(d !== undefined)
вызывается два раза. Нужно как-нибудь избавится от этого условия и чтобы функция, вызывалась только один раз. Если поставить условие в классе, то это погоды не сделает, т.к. я уже говорил, что функция вызывается точно только один раз.

Последний раз редактировалось Йакуд, 16.06.2011 в 14:05.
Ответить с цитированием
  #6 (permalink)  
Старый 16.06.2011, 14:08
Аватар для Nekromancer
Профессор
Отправить личное сообщение для Nekromancer Посмотреть профиль Найти все сообщения от Nekromancer
 
Регистрация: 06.05.2009
Сообщений: 1,163

Вообще "get" в jQuery багнутая, в старых версиях она в опере 2 раза вызывала callback, скорее всего в этом дело.
На счёт объекта лишнего ..
Если вы объект используете по ссылке this не обязательно на неё и передавать, можно спокойно передавать как аргумент функции.
__________________
Нужно равняться на лучших, а не оправдываться за счёт худших.
Ответить с цитированием
  #7 (permalink)  
Старый 16.06.2011, 15:07
Новичок на форуме
Отправить личное сообщение для Йакуд Посмотреть профиль Найти все сообщения от Йакуд
 
Регистрация: 26.11.2010
Сообщений: 8

Все, я разобрался в чем проблема... Проблема была вовсе не в get и не в jQuery. Дело в том, что я передавал через get не те данные. Я передавал объект, а нужно было массив.
Вместо
$.get(then.phpGet, param, function(data){
  /* ... */
});
Нужно было
$.get(then.phpGet, param.param, function(data){
  /* ... */
});

Т.к. в функцию then.getInfo я передавал не массив, а объект содержащий в себе массив, отсюда и был лишний вызов функции.
Всем спасибо за отклик!
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Срочно JS developer okp Работа 7 14.06.2011 14:54
Про замыкания Иваннн Общие вопросы Javascript 3 12.01.2011 11:12
Не получается передать переменную из JS в PHP Lion_astana AJAX и COMET 2 23.11.2010 17:23
помогите задать переменную в js bsgroupua Общие вопросы Javascript 3 01.02.2010 18:28
Самая лучшая книга по JS? ulandj Оффтопик 2 06.04.2009 11:35