Обратный звонок и сфера - PullRequest
       9

Обратный звонок и сфера

0 голосов
/ 19 декабря 2008

У меня возникла проблема с полным пониманием объема обратных вызовов при попытке изучить Jquery. Я бы добавил, что у меня мало опыта работы с языком Javascript. Код:

var globDom;    // placeholder for DOM fragment

// Getting xml file; jquery parses the file and give me back a DOM fragment
// saveXML is the callback

$.get(requestTarget, {}, saveXML);

// the globDom here is UNDEFINED !

alert(globDom);

// the callback

function saveXML(xmlDom)
{
    globDom = xmlDom;
}

Я уверен, что здесь есть БОЛЬШОЕ недоразумение мной ...

Есть предложения?

Спасибо

Daniel


Ах-Ах. Совершенно ясно, я прекрасно понимаю ошибку в моем предположении: я забыл учесть разницу во времени между временем доступа к данным (предыдущее!) И временем, когда контент становится доступным. Достаточно серьезный недостаток - пакетное программирование предвзято

Ответы [ 4 ]

6 голосов
/ 19 декабря 2008

Я сам не использовал jquery, но, насколько я понимаю, многое из того, что он делает, является асинхронным. Этот метод get, вероятно, не вызывает ваш обратный вызов немедленно. Вам нужно подождать, пока не будет выполнен обратный вызов, прежде чем пытаться получить доступ к globDom.

Попробуйте поместить оповещение в ваш метод обратного вызова. Это происходит до или после оповещения, которое вы поставили после get ()?

4 голосов
/ 19 декабря 2008

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

Например:

// Getting xml file; jquery parses the file and give me back a DOM fragment
// saveXML is the callback

$.get(requestTarget, {}, saveXML);

// the callback

function saveXML(xmlDom)
{
    // the xmlDom here is DEFINED !

    alert(xmlDom);
}
1 голос
/ 19 декабря 2008

Я думаю, что у тебя все хорошо. saveXML создает замыкание , которое включает globDom в область действия. Закрытие, если вы не знакомы с этим термином, означает, что область действия, в которой определена функция, включена в область действия этой функции. Это означает, что поскольку globDom находится в области, в которой определено saveXML, тело saveXML может получить доступ к тому же экземпляру globDom, что и предупреждение, определенное над ним.

Я думаю, что ваша настоящая проблема заключается в том, что $ .get не является синхронным. $ .get возвращается немедленно, до завершения извлечения, что означает, что оповещение вызывается до выполнения обратного вызова. Вместо этого вы можете использовать $ .ajax и установить для параметра «async» значение false, что приведет к тому, что вызов $ .ajax не будет возвращаться до тех пор, пока запрос сервера не будет выполнен.

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

0 голосов
/ 19 декабря 2008

Что сказал Гермс. Ваша (упрощенная) временная шкала выглядит как

0.001 globdom = undefined;
0.002 $.get(somerequest, callback)
0.003 alert(globdom)

.. 50 milliseconds later ..

0.053 saveXml(xmlDom)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...