Замыкания в 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 с полученными параметрами. Как это можно реализовать? Прочитал статью на сайте про замыкания и, честно говоря, мало чего понял. Буду очень благодарен за помощь. |
В место then использовать this?
|
Собственно, какая разница-то? Объект then у меня создается и в дальнейшем используется он. Тут все в норме.
На самом деле, все само заработало =___=. Но теперь одна ошибочка есть. Функция End вызывается как-будто два раза. Первый раз аргумент undefined, а второй раз возвращает то, что нужно. Приходится делать проверку на undefined вот в этом месте
End: function(d){
if(d !== undefined)
alert(d)
}
Но это не очень красиво. Как можно избежать этой проверки? Да и вообще, почему функция, может вызываться два раза? Хотя вызываю я ее точно один! Я проверял уже. |
Цитата:
Про 2 раза не знаем, весь код не видели, мало ли чего вы намудрили. |
Лишний объект создал из-за того, что буду обращаться из объекта jQuery, а там this уже имеется. Это для своего удобства. Мне кажется, что лишний объект не сильно повлияет на быстродействие.
Цитата:
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)вызывается два раза. Нужно как-нибудь избавится от этого условия и чтобы функция, вызывалась только один раз. Если поставить условие в классе, то это погоды не сделает, т.к. я уже говорил, что функция вызывается точно только один раз. |
Вообще "get" в jQuery багнутая, в старых версиях она в опере 2 раза вызывала callback, скорее всего в этом дело.
На счёт объекта лишнего .. Если вы объект используете по ссылке this не обязательно на неё и передавать, можно спокойно передавать как аргумент функции. |
Все, я разобрался в чем проблема... Проблема была вовсе не в get и не в jQuery. Дело в том, что я передавал через get не те данные. Я передавал объект, а нужно было массив.
Вместо
$.get(then.phpGet, param, function(data){
/* ... */
});
Нужно было
$.get(then.phpGet, param.param, function(data){
/* ... */
});
Т.к. в функцию then.getInfo я передавал не массив, а объект содержащий в себе массив, отсюда и был лишний вызов функции. Всем спасибо за отклик! |
| Часовой пояс GMT +3, время: 09:35. |