Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> function and callback ? 
V
    Опции темы
neoks
Дата 10.1.2011, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 425
Регистрация: 5.7.2010

Репутация: нет
Всего: 1



Не знаю как сказать да и как называется метод.! Но в jquery есть функции например post.
Суть в том что можно вызвать callback написав только путь к файлу, то есть $.post(//путь,function()); и можно так $.post(//путь,{параметры},function());

Ну и вот столкнулся с такой вот проблемой. Например есть функция:
Код

function echo_error(info,callback){
   elem.animate(top:'20px',200,fumction(){

  if(callback){ callback()}   

 ...

})
}


Вызов с пустым info 

Код

echo_error('',function(){
   ....
})


Ну вот и собственно вопрос как сделать так чтоб не писать '' пустую переменную, и возможно вообще ?
PM MAIL   Вверх
Amphiluke
Дата 10.1.2011, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


   ☽
***


Профиль
Группа: Завсегдатай
Сообщений: 1253
Регистрация: 26.8.2009

Репутация: 35
Всего: 112



Посмотрите в исходном коде jQuery:
Цитата(jQuery)

Код

post: function( url, data, callback, type ) {
    // shift arguments if data argument was omited
    if ( jQuery.isFunction( data ) ) {
  type = type || callback;
  callback = data;
  data = {};
    }

    return jQuery.ajax({
  type: "POST",
  url: url,
  data: data,
  success: callback,
  dataType: type
    });
},



Вообще, в случае, когда функция имеет необязательные аргументы, обычной практикой является объединение всех аргументов в один аргумент объектного типа с говорящими именами свойств. Например:
Код

function foo(args) {
    if (!args) args = {};
    if (!args.info) args.info = "info_default_value";
    if (!args.callback) args.callback = function() {
        alert("this default callback function is called if no callback function was specified");
    }
    // do something
}

foo();
foo({ info:"custom info" });
foo({ info:"custom info", callback:function() { alert("My callback function"); } });


Это сообщение отредактировал(а) Amphiluke - 10.1.2011, 20:11
PM   Вверх
neoks
Дата 10.1.2011, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 425
Регистрация: 5.7.2010

Репутация: нет
Всего: 1



Забавно но я так и не понял в чем прикол как сделать, и функция foo() тоже не работает, вообщем так и не понял.

Вот код который на котором я испытываю:

Код

function is_loading(info,callback){
    
    var is_info     = (info) ? info : is_loading_info,
        elem        = $(is_loading_var),
        status      = elem.css('display');
        
    if(status == 'none')
    elem.show('slow',function(){ if(callback) { callback() } }).find('span').text(is_info+'...');
    else{
        close_is_loading(function(){
            is_loading(is_info);
        });
    }
}


Вызов:

Код

    is_loading('',function(){
         alert('test');
    });
    });


Все картину портят кавычки ''
    
PM MAIL   Вверх
Amphiluke
Дата 10.1.2011, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


   ☽
***


Профиль
Группа: Завсегдатай
Сообщений: 1253
Регистрация: 26.8.2009

Репутация: 35
Всего: 112



Блин.  smile  Ну как еще объяснить. Я думал, что понятно выразился.  smile 

Ну, давайте на примере вашей функции сделаем оба аргумента необязательными.
Код

function is_loading(info,callback){
    switch (arguments.length) {
        case 1:
            if (typeof info == "string") {
                callback = function() {}
            } else {
                callback = info;
                info = "";
            }
            break;
        case 0:
            callback = function() {};
            info = "";
            break;
    }
    // дальше как намечено


Добавлено через 14 минут и 23 секунды
Кстати, поскольку вы используете jQuery, то единственный аргумент-объект был бы наиболее подходящим решением, т.к. в jQuery есть прекрасный метод extend(), с помощью которого можно было бы заполнить пропущенные поля значениями по умолчанию.

PM   Вверх
neoks
Дата 10.1.2011, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 425
Регистрация: 5.7.2010

Репутация: нет
Всего: 1



Спасибо!  smile  Работает, но код немного многоват, суть в том что функция будет не одна и придется писать на каждую функцию.
Можно как то код сократить ? если нет то буду юзать по старинке  smile 
PM MAIL   Вверх
Amphiluke
Дата 10.1.2011, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


   ☽
***


Профиль
Группа: Завсегдатай
Сообщений: 1253
Регистрация: 26.8.2009

Репутация: 35
Всего: 112



Цитата(neoks @  11.1.2011,  00:29 Найти цитируемый пост)
Можно как то код сократить ?

Я вам уже сказал, как.

Цитата(Amphiluke @  10.1.2011,  23:03 Найти цитируемый пост)
Вообще, в случае, когда функция имеет необязательные аргументы, обычной практикой является объединение всех аргументов в один аргумент объектного типа с говорящими именами свойств


и

Цитата(Amphiluke @  11.1.2011,  00:05 Найти цитируемый пост)
Кстати, поскольку вы используете jQuery, то единственный аргумент-объект был бы наиболее подходящим решением, т.к. в jQuery есть прекрасный метод extend(), с помощью которого можно было бы заполнить пропущенные поля значениями по умолчанию.


Код

function is_loading(args) {
    var defaults = { info:"", callback:null };
    args = $.extend(defaults, args);
    // и дальше использовать args.info и args.callback


Добавлено @ 21:44
Соответственно, вызывать можно так:
Код

is_loading();

так:
Код

is_loading({ callback:function() {alert("fff");} });

так:
Код

is_loading({ info:"fff" });

так:
Код

is_loading({ callback:function() {alert("fff");}, info:"fff" });


Это сообщение отредактировал(а) Amphiluke - 10.1.2011, 21:54
PM   Вверх
neoks
Дата 10.1.2011, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 425
Регистрация: 5.7.2010

Репутация: нет
Всего: 1



Спасибо! буду практиковаться, я только учусь вот и собственно вопросы.  smile 
PM MAIL   Вверх
neoks
Дата 11.1.2011, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 425
Регистрация: 5.7.2010

Репутация: нет
Всего: 1



Блин может я туплю но чо то не работает.
Делаю вызов а алерт не срабатывает.

Код

 is_loading({ info:"test",callback:function() {alert("fff");} }); 


Сам код:
Код

function is_loading(args){
    
    
    var defaults = { info:"", callback:null };
    args         = $.extend(defaults, args);
                
            
    var is_info     = (args.info) ? args.info : is_loading_info,
        elem        = $(is_loading_var),
        status      = elem.css('display');
        
    if(status == 'none')
    elem.show('slow',function(){ if(args.callback) { callback() } }).find('span').text(is_info+'...');
    else{
        close_is_loading(function(){
            is_loading({ info:is_info });
        });
    }
}


При этом после вызова не срабатывает другая функция:
Код

function close_is_loading(callback){
    $(is_loading_var).hide('slow',function(){  if(callback) { callback() }  });
}


Вроде все понятно но не работает, то есть info работает как и без аргументов но callback не срабатывает

Добавлено через 5 минут и 19 секунд
Может тут не правильно :

Код

if(args.callback) { callback() }

PM MAIL   Вверх
Amphiluke
Дата 11.1.2011, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


   ☽
***


Профиль
Группа: Завсегдатай
Сообщений: 1253
Регистрация: 26.8.2009

Репутация: 35
Всего: 112



Цитата(neoks @  11.1.2011,  15:51 Найти цитируемый пост)
if(args.callback) { callback() }

Куда потерялся объект args при попытке вызова ф-ции callback?
Код

if(args.callback) { args.callback(); }



PM   Вверх
neoks
Дата 12.1.2011, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 425
Регистрация: 5.7.2010

Репутация: нет
Всего: 1



O_o теперь работает Спасибо!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1014 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.