Как добавить обратный вызов для функции в JavaScript - PullRequest
22 голосов
/ 07 октября 2011

У меня есть две функции JavaScript

function one () {
   do something long... like writing jpgfile on disk
}

function two () {
   do something fast... like show the file
}

Я называю это (в jQuery) так

 one ();
 two ();

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

примечание: я поместил оповещение ('aaa') между этими двумя функциями, чтобы завершить функцию one, и все заработало нормально ... когда оповещение закомментировано (удалено), больше ничего не работает!

Ответы [ 4 ]

47 голосов
/ 07 октября 2011

Вы должны использовать обратный вызов только в том случае, если вы делаете что-то асинхронное, иначе не имеет значения, сколько времени занимает что-то, следующая функция не будет работать до тех пор, пока не завершится первая.

Обратный вызовпросто передавая функцию в качестве аргумента, а затем вызывая ее по завершении.

function one (callback) {
   do something long... like writing jpgfile on disk
   callback();
}

function two () {
   do something fast... like show the file
}

one(two);

Очевидно, что если вы делаете что-то асинхронное, то вам нужно что-то, что сообщит вам, когда это произойдет.закончено (например, запуск события).

13 голосов
/ 07 октября 2011

Простой:

function one (callback) {
   do something long... like writing jpgfile on disk

    if(callback) callback();
}

function two () {
   do something fast... like show the file
}

one(two);
4 голосов
/ 10 февраля 2015

Попробуйте,

$.when($.ajax(fuction1())).then(function () {

fuction2;

});

Здесь fuction1 - ваша первая функция для вызова, а fuction2 - ваша вторая функция.

0 голосов
/ 07 октября 2011

Я думаю, что это легко, если браузер ожидает выполнения процесса внутри "one ()", прежде чем выполнить следующую строку команды. Айсберг поразил Титаника, потому что он не ждет. Затем выполните это:

one(two) // while two is the callBack parameter

ничем не отличается от:

one()
two()

Я предлагаю использовать setInterval.

function one(){
    //--- Write the file to disk
    //.....................
}

function runTwo(){
    if (check_the_written_file_existence){
         clearInterval(t)
         two();
    }
}
var t = setInterval("runTwo()",500)

Наиболее важным моментом является то, что если происходит событие, когда "длинный процесс" в функции "one ()" завершен, вам просто нужно связать функцию два с этим событием. Если только вы не будете проверять результат каким-либо образом каждый промежуток времени, пока он действительно не будет сделан.

...