Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Применение библиотек > Как cоздать собственную ф-цию с обратным вызовом


Автор: numerovan 30.8.2010, 19:13
Здравствуйте, помогите решить проблему : создать свою функцию с обратным вызовом, т.е. имею ф-ию f1() , каторую буду вызывать после окончании выполнения созданной мною новой функции f2().

Автор: ksnk 30.8.2010, 19:40
Откуда берется f2 и/или каким образом она создается? Почему нельзя  в текст создаваемой функции влепить вызов f1?

Автор: numerovan 30.8.2010, 19:48
Цитата(ksnk @ 30.8.2010,  19:40)
Откуда берется f2 и/или каким образом она создается? Почему нельзя  в текст создаваемой функции влепить вызов f1?

Допустим я хочу создать новую функцию
Код

// за ранее подготовленная функция
function myFn_1(){
 ...
}


// новая функция в которой должнj сработать то что внутри прописано и ещё должнj по окончанию выполнения ф-ии myFn_2() выполниться ф-ия myFn_1()
function myFn_2(param, callback){
 // тут разные выполнения
}

как такое сделать ? 
Фукнция создаётся обычным способом. В текст нельзя влепить так как нужно точно знать что myFn_2() выполнила всё что ей сказанно и далее нужно выполнение ф-ии myFn_1(), а не перемешивалось выполнение программы

Автор: ksnk 30.8.2010, 20:03
Код

function myFn_2(param, callback){
 // тут разные выполнения

 if(callback) callback();
}

?

Автор: numerovan 30.8.2010, 20:52
Цитата(ksnk @ 30.8.2010,  20:03)
Код

function myFn_2(param, callback){
 // тут разные выполнения

 if(callback) callback();
}

?

Спасибо за ответ, но хочу огорчить что есть более правильный подход к этому решению. 

Автор: bars80080 30.8.2010, 21:33
понял ksnksmile и больше так не делай

Автор: ksnk 30.8.2010, 21:57
Цитата(numerovan @  30.8.2010,  20:52 Найти цитируемый пост)
Спасибо за ответ, но хочу огорчить что есть более правильный подход к этому решению.

Хотелось бы огорчится.  smile 
Код будет?

Автор: numerovan 30.8.2010, 22:54
Bars80080 , вроде ты на все вопросы знаешь ответ , помог бы с решением ...

Автор: bars80080 31.8.2010, 14:18
а я не понял вопроса. максимум что можно представить по задаче, так ksnk озвучил качественное решение, я сам таким пользуюсь

послушайте, если просят повторить вопрос, то лучше не пытаться вновь его выразить абстрактными идеями, а описать конкретную задачу.
вот у меня к примеру была такая. написал я универсальную функцию, которая отправляла запросы по аяксу:
ajaxQuery(url, query, method);
возник вопрос, как разбирать приходящий ответ, ведь функции-обработчики каждый раз будут разные. ответ простой, передаём и само имя обработчика:

Код

ajaxQuery(url, query, method, myFunc1);


внутри функции ajaxQuery обработчик вызывается:
Код

function ajaxQuery(u, q, m, f) {
    //...
    rq.onreadystatechange = function() { 
        if(rq.readyState == 4) { if(typeof(f) == "function") { f(rq.responseText); return true; }}}     
    //...
}

то есть при приёме ответа будет вызвана функция myFunc1(rq.responseText)

всё ясно и чётко, работает отлично.
на твой вопрос могу предложить только это, то есть тот же самый пример ksnk

Автор: numerovan 4.9.2010, 00:25
в jQuery есть функция, допустим, fadeOut() , сами знаете что на обёрнутый набор элементов она "растворяет" их , к примеру
 
Код

$("#id").fadeOut("normal", function(){ alert(); // вот alert , каторый вызывается по завершении fadeOut});
 
и сколько бы я времяни не поставил на растворение объекта, я точно знаю что по завершению вызовиться Alert. 


Вопрос: как разработчики организовали возможность обратного вызова функции в функции ?

Автор: bars80080 4.9.2010, 00:30
Цитата(numerovan @  4.9.2010,  00:25 Найти цитируемый пост)
как разработчики организовали возможность обратного вызова функции в функции ? 

это свойство javascript. а разработчики fadeOut тут не причём, они просто пользуются тем что есть

называется это - вызов анонимной функции, то есть без имени. странно, что ты ранее этим не пользовался

что мешает тоже самое сделать для своего метода/функции?

Автор: ksnk 4.9.2010, 00:36
Цитата(numerovan @  4.9.2010,  00:25 Найти цитируемый пост)
Вопрос: как разработчики организовали возможность обратного вызова функции в функции ? 

Будешь смеятся, но примерно так как я уже писал ;)
Это и был огорчительный для меня пример?

Автор: numerovan 4.9.2010, 21:01
Цитата

что мешает тоже самое сделать для своего метода/функции?

вот я и хочу так сделать
Цитата

Это и был огорчительный для меня пример?

помоему тут нужно ещё подумать ...
Так значит приходим к выводу что подобное делается так как сказал ksnk ?
Код

function myFn_2(param, callback){
 // тут разные выполнения
 if(callback) callback();
}

Хотите сказать что если написать подобное
Код

function myFn(a, b){
      if(b) b();
      // разные действия
}

функция b() выполниться в последнию очередь ? Помоему нет. Даже если и так
Код

function myFn(a, b){
      // разные действия
      $("#id").fadeOut("10000");
       if(b) b();
}

она не вызовиться последней, в данном примере функция myFn выполнит $("#id").fadeOut("10000"), начнётся затухание, после выполнит ф-ию b(), а когда пройдёт 10 секунд то тогда ф-ия myFn закончит свою работу ... Я бы хотел сделать в следующем порядке, чтоб вначале закончилась ф-ия $("#id").fadeOut("10000"), хоть и 20 секунд бы стояло, то после чтоб запустилась ф-ия b()

Автор: ayax2005 4.9.2010, 21:58
Два раза перечитал тему с самого начала.
Уважаемый, numerovan, вам бы определиться чего вы хотите добиться и зачем, а уже потом людям моск и3ь.

Автор: ksnk 4.9.2010, 22:47
если предварительно почитать описание функции fadeOut, то можно заметить у нее несколько параметров, кроме первого и методом не очень сложного умозаключения породить примерно такой код
Код

function myFn(a, b){
      // разные действия
      $("#id").fadeOut("10000", function(){ 
           if(b) b();
      });
}

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

Автор: numerovan 8.9.2010, 21:19
тема ещё не закрыта ... я представлял себе на подобие конструктора и деструктора, в качестве деструктора, служила бы та функция про которую я писал ... Прошу прощения, если я что-то не правильно написал ... будем двигаться дальше.

Автор: doook 8.10.2010, 08:20
Тему уже пора закрывать, тут  я нашёл ответы на все вопросы =) 
numerovan если что то не понят спроси меня может у меня получится тебе объяснить?  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)