2011-07-11 2 views
1

Я недавно работал над некоторыми функциями AJAX, используя MooTools. Моя проблема заключается в коде сразу после:Переменная Javascript, не объявляющая в области функции

function changePage(id, url) { 
    var c = false, 
     r = null; 

    for (i = 0; i < history.length; i++) { 
     if(history[i]['id'] === id) { 
      console.log('cached'); 
      r = history[i].response; 
      c = true; 
     } 
    } 
    if(!c) { 
     makeRequest(url, function(response) { 
      r = response; 
      history.push({id: id, response: response}); 
     }); 
    } 

    changeBackground('_background', {color: r.bgColor, image: r.bgImage}); 
    lightboxContents(generateArticle(r.article.id, r.article.title, r.article.body, r.article.timestamp)); 
    return true; 
} 

Здесь всякий раз, когда выполняется код (он направляется через клик), я послал сообщение об ошибке «„г“не определена», - заявление о том, по-моему, ошибочно.

Я также хотел бы попробовать заменить «r» глобальной переменной, используя объект «window» - та же проблема.

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

Спасибо за ваше время! Тимон

+0

Если вы используете 'console.log (r)', что вы получаете? Похоже, что 'r' не получает его значение (возможно, из-за некоторой ошибки). – Mrchief

ответ

3

r, скорее всего, не определено, потому что это выглядит как makeRequest асинхронный AJAX вызова, а это означает, что его функция обратного вызова только вызывается после того, как запрос завершается. Поскольку вызов является асинхронным, среда выполнения JS не ждет там и продолжает выполнять инструкции после него, что в вашем случае - вызовы changeBackground и generateArticle. Однако, поскольку вызов AJAX не вернулся к этому моменту и обратный вызов не был вызван, r по-прежнему является нулевым. Поэтому, пытаясь получить доступ к любому имуществу на r, как r.bgColor, вы получите ReferenceError.

+0

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

+0

Перемещение кода внутри обратного вызова ajax - путь. организовать функции информации о кодах или модули, как вы хотите. но отправной точкой будет обратный вызов ajax. – Anurag

+0

Хорошо, спасибо за вашу помощь. Спасли меня несколько дней мучительного возиться! –

0

Похоже, вы пытаетесь использовать r, прежде чем дать ему значение, пока оно еще null. Когда вы загружаете свою страницу, нет истории, поэтому r не получит значение. И тогда у вас есть функция async, назначающая значение r, но код, который нуждается в r, чтобы иметь значение, будет выполняться до выполнения асинхронного кода.

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