2015-06-16 4 views
2

Я пытаюсь передать одну функцию в другую, чтобы я мог ее вызвать, когда вызов ajax завершился, но я получаю сообщение об ошибке, заявляя, что функция, которую я хочу вызвать, не является функция.Функция Javascript, не вызывающая функция, переданная как параметр

File1 (Loaded первая)

function functionOne() { 
    //Some Code 
} 

File2 (Loaded второй и содержит АЯКС вызов)

function functionTwo(functionOne) { 
    functionOne(); 
} 

functionTwo(); 

Я получаю ошибку консольную TypeError: functionOne is not a function

Мой вопрос два раза:

  1. Почему functionOne не входит во вторую функцию?
  2. Это лучший способ обеспечить, чтобы вызов ajax завершился, прежде чем запускать мой первый функциональный код?
+5

Как вы называете 'functionTwo'? – Tushar

+1

* «1. Почему функция functionOne выходит из области действия во второй функции?» * Ничего не видно. У вас есть параметр с именем 'functionOne', который затеняет глобальный. * «2. Это лучший способ обеспечить, чтобы вызов ajax закончился, прежде чем запускать мой первый функциональный код?» * Зависит от того, что вы имеете в виду. Ты действительно не показываешь, что делаешь. –

+0

@Tushar Извините, это называется потом. Amended – Antfish

ответ

2

В functionTwo, вы теневые functionOne, как вы объявляете его в качестве аргумента: код в functionTwo только видит эту новую переменную, а не глобальный с тем же именем.

Но ваш подход не тот, он не гарантирует порядок исполнения, который вы ищете.

Функция ajax jQuery возвращает promise, что является способом решения асинхронных функций и выполнения какой-либо функции при завершении вызова ajax.

Если вы хотите functionTwo начать вызов Ajax, а затем вызвать functionOne, вы можете сделать это:

function functionOne() { 
} 

function functionTwo() { 
    return $.ajax({ // don't forget the return 
     // many parameters here 
    }).then(function(data){ 
     // use the data here 
    }); 
} 

functionTwo().then(functionOne); 

Это обеспечивает functionOne вызывается только после того, как вызов Ajax началась в functionTwo закончил.

Если вы хотите использовать по старинке и передать эту функцию в качестве аргумента, сделать это следующим образом:

function functionOne() { 
} 

function functionTwo(callback) { 
    $.ajax({ 
     // many parameters here 
    }).then(function(data){ 
     // use the data here 
    }).then(callback); 
} 

functionTwo(functionOne); 

Но это 2015, то лучше начать смотреть на deferreds и обещаний;)

+0

Спасибо за ваш ответ. Я посмотрел на обещание, но не знал точно, как его выполнить. Для дальнейшего использования, если бы я хотел передать одну функцию в другую, а не затенять ее, как бы я это сделал? – Antfish

+1

@Antfish Я отредактировал –

Смежные вопросы