2016-04-01 2 views
0

Я передаю функцию обратного вызова, как показано ниже, но я не могу вызвать эту функцию, когда onreadystatechange изменяет значение i.e. request.onreadystatechange = func. Я получаю правильный ответ от сервера, когда я вызываю запрос ajax, но этот метод func не вызван. Обратите внимание, что функ передается в виде строки, когда я называю getFromServer("http://localhost/ch02/checkName.php?username=sas","func")присвоение функции обратного вызова переменной

function createRequest() { 
    try { 
     request = new XMLHttpRequest(); 
    } 
    catch (failed) { 
     request = null; } 
    finally { 
     return request; 
    } 
} 

function func(){ 
    alert("ok"); 
} 

function getFromServer(url,readystateCallback) { 
    request=createRequest(); 
    if (request == null) { 
     alert("unable to create request"); 
    } else { 
     request.open("GET", url, true); 
     var func= new Function (readystateCallback); 
     request.onreadystatechange = func; 
     request.send(null); 
    } 
    return request; 
} 
+0

Я не хочу использовать круглые скобки здесь с readystateCallback. Он должен выполняться только тогда, когда запрос изменяет свое состояние. –

+0

мой плохой, то будет была ошибка, удалил комментарий ... Я имел в виду: 'request.onreadstatechange = readystateCallback' – JordanHendrix

+1

Используйте анонимную функцию: ' request.onreadystatechange = функция() {// делать что-то здесь - вы можете поместить вызов функции здесь. } ' Что вы делаете в своем примере, это передать строку, а затем назначить обратный вызов на строковое значение, а не выполнять фактический вызов функции. – Korgrue

ответ

1

Если функция определена в глобальном масштабе, он будет добавлен к window объекта, так что вы можете сделать:

var func = window[readystateCallback]; 

Но вместо этого вы должны создать свой собственный объект, который сопоставляет имена функций функциям. Таким образом, вы можете получить доступ к функциям в локальной области, и вы также не можете непреднамеренно вызвать некоторую неожиданную функцию в качестве обратного вызова.

function func() { 
    alert("ok"); 
} 
function otherfunc() { 
    alert("really great"); 
} 
... 

var callbacks = { 
    "func": func, 
    "otherfunc": otherfunc, 
    ... 
} 

Тогда вы можете сделать:

function getFromServer(url,readystateCallback) { 
    request=createRequest(); 
    if (request == null) { 
     alert("unable to create request"); 
    } else { 
     request.open("GET", url, true); 
     var func= callbacks[readystateCallback]; 
     request.onreadystatechange = func; 
     request.send(null); 
    } 
    return request; 
} 

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

getFromServer("http://localhost/ch02/checkName.php?username=sas", func); 

Тогда вы просто сделать:

request.onreadystatechange = readystateCallback; 
+0

Проблема с этим подходом заключается в том, что getFromServer находится в моей библиотеке утилит для часто используемых функций. Обратные вызовы не будут иметь никакой идеи относительно того, какие другие пары имени и значения могут потребоваться в будущем. Только модуль в моем текущем проекте знает имя функции, и сама функция определяется только в этом проекте. Любой другой проект будет иметь свою функцию обратного вызова. –

+0

Почему вы передаете имена функций в виде строк вместо самой функции? – Barmar

+0

Я передаю имена функций как строки для удобочитаемости. Должен быть какой-то способ вызвать функцию из строки. –

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