2016-03-14 2 views
0

Возможно ли передать функцию обратного вызова, которая еще не существует? Моя цель состоит в том, чтобы иметь общую функцию, которая будет ждать, пока существует еще одна функция обратного вызова, когда она существует, она должна ее выполнить. Это то, что у меня есть до сих пор, но я не могу понять, как передать функцию, которая еще не существует как функция.Передайте функцию как параметр, который еще не существует в Javascript

function RunTemplateFunction(callback, userInfo) { 
if ($.isFunction(callback)) { 
    callback(userInfo); 
} else { 
    var myInterval = setInterval(function() { 
     if ($.isFunction(callback)) { 
      clearInterval(myInterval); 
      callback(userInfo); 
     } 
    }, 200); 
} 
} 

я запустить функцию так:

RunTemplateFunction(MyFunctionToRun, GetUserInfo()); 

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

Любая помощь приветствуется. Спасибо.

+0

Возможно ли вы по крайней мере объявить функцию перед вызовом 'RuntemplateFunction'? – shriek

ответ

1

Если вы звоните RunTemplateFunction по undefined, мы не можем видеть, является ли обратный вызов определенным или нет, поскольку у нас нет ссылки на что-либо.

Если вы можете изменить заявление принять object, как показано ниже, мы можем добиться того, что мы хотим

function RunTemplateFunction(options, userInfo) { 
    if ($.isFunction(options.callback)) { 
     console.log('called1',userInfo); 
     options.callback(userInfo); 
    } else { 
     var myInterval = setInterval(function() { 
      if ($.isFunction(options.callback)) { 
       console.log('Called dynamically!!'); 
       clearInterval(myInterval); 
       options.callback(userInfo); 
      } 
     }, 200); 
    } 
} 
var options = {} 
RunTemplateFunction(options,{user:122}); 

options.callback = function(){ 
console.log("I'm called!!"); 
} 

Это напечатает

Called dynamically!! 
I'm called!! 

EDIT:

Мы также можем звоните callback функции следующим образом: setInterval, он будет выглядеть d ifferent, но options.callback переменная заменяется функцией template.callMe и ее мгновенной.

function TemplateRunner(userInfo){ 
    this.callMe = function(cb){ 
    this.templateFunction(cb); 
    } 
    this.templateFunction = function(callback){ 
    callback(userInfo); 
    } 
} 
var template = new TemplateRunner({user:100}) 
template.callMe(function(user){ 
    console.log('call me1',user); 
}); 
template.callMe(function(user){ 
    console.log('call me2',user); 
}) 

Это напечатает

call me1 {user: 100} 
call me2 {user: 100} 
+0

спасибо за ответ - я могу проверить сегодня вечером и обновить. – cmartin

+0

Я проверил это, и он действительно работает - я обязательно сохраню эту технику в заднем кармане. Однако мне нужно запустить несколько функций таким образом, которые загружаются из нескольких наборов скриптов. Поэтому в основном они просто будут переписывать options.callback. Мне почти нужно было хранить функции в объекте списка, но потом я думаю, что вернусь к квадрату с кодом, необходимым для определения того, какую функцию я пытаюсь запустить. Если у вас есть другие хорошие идеи, пожалуйста, поделитесь! – cmartin

+0

Я отредактировал ответ, это то, что мы намеревались? – JagsSparrow

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