Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 13.02.2013, 18:36
Интересующийся
Отправить личное сообщение для bogong Посмотреть профиль Найти все сообщения от bogong
 
Регистрация: 13.10.2011
Сообщений: 24

Видимость значений объекта. Как?
Есть скрипт:
window.onload=function(){
	notification.render.create();
}
var notification={

	properties:{
		rootElement:"noticeContent",				
		listElement:"notificationList",					
		rssUrl:"http://www.server.com/rss/",			
		rssFeed:{},								
		rssFeedCount:null,						
	},

	render:{
		create:function(){
			notification.kinematics.getRss(notification.properties.rssUrl);
			console.log(notification.properties.rssFeed);
		},
	kinematics:{
		getRss:function(url){
			var rssXml=new XMLHttpRequest();
			rssXml.open("GET",url,true);
			rssXml.send(null);
			rssXml.onreadystatechange=function(){
				if(rssXml.readyState==4){
					if(rssXml.status==200){
						var xml=rssXml.responseXML;
						var count=xml.getElementsByTagName(notification.properties.rssTags.video).length;
						notification.properties.rssFeedCount=count;
						for(i=0;i<count;i++){
							var item=xml.getElementsByTagName(notification.properties.rssTags.video)[i];
							if(item.getElementsByTagName(notification.properties.rssTags.priority)[0].textContent=="1"){
								notification.properties.currentTumb=i;
							}
							notification.properties.rssFeed[i]={
								title:item.getElementsByTagName(notification.properties.rssTags.title)[0].textContent,
								linkToPage:item.getElementsByTagName(notification.properties.rssTags.linkToPage)[0].textContent,
								linkToImage:item.getElementsByTagName(notification.properties.rssTags.linkToImage)[0].textContent,
								description:item.getElementsByTagName(notification.properties.rssTags.description)[0].textContent,
								pubDate:item.getElementsByTagName(notification.properties.rssTags.pubDate)[0].textContent,
								priority:item.getElementsByTagName(notification.properties.rssTags.priority)[0].textContent
							};
						}
						
					}else{return false}
				}else{return false}
			}
		}
}

Ситуация такова: мне нужно распарсить RSS и положить это все в объект, происходит следующее: прошу вывести в консоль значение notification.properties.rssFeed если я это делаю сразу после парсера в той же самой функции все нормально, если я вызываю в конце window.onload - все хреново, объект пустой - почему??? Помогите люди добрые ...
Ответить с цитированием
  #2 (permalink)  
Старый 13.02.2013, 19:23
Интересующийся
Отправить личное сообщение для bogong Посмотреть профиль Найти все сообщения от bogong
 
Регистрация: 13.10.2011
Сообщений: 24

Сообщение от Дзен-трансгуманист Посмотреть сообщение
У вас ведь асинхронный запрос. Пытаясь вывести результат незамедлительно после getRss, вы ничего не получите, так как onreadystatechange еще не отработал.

И я так понимаю, тут придется объединить асинхронность аякса с событием загрузки окна, то есть нужно будет проверять состояние готовности обеих сущностей как из onreadystatechange, так и из onload. И окончательное действие совершать только во второй раз.
А как это объеденить??? Через какой-то внешний маркер и цикл ожидания значения маркера???
Ответить с цитированием
  #3 (permalink)  
Старый 13.02.2013, 19:32
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Дзен-трансгуманист, ну сейчас же у него сначала наступает событие onload, затем только производится xhr.
bogong, в случаях с асинхронными действиями, нужно использовать callback'и.
Например можно передать callback-функцию в notification.render.create(fn)

а по получению rss - вызывать эту функцию
Ответить с цитированием
  #4 (permalink)  
Старый 13.02.2013, 19:43
Интересующийся
Отправить личное сообщение для bogong Посмотреть профиль Найти все сообщения от bogong
 
Регистрация: 13.10.2011
Сообщений: 24

Сообщение от danik.js Посмотреть сообщение
Дзен-трансгуманист, ну сейчас же у него сначала наступает событие onload, затем только производится xhr.
bogong, в случаях с асинхронными действиями, нужно использовать callback'и.
Например можно передать callback-функцию в notification.render.create(fn)

а по получению rss - вызывать эту функцию
callback не получить ..., я забадался с этого сервера нормально заголовки получать ... Там странный прогер сидит Лучше не трогать каллбэк от сервера
я решил попробовать через наблюдателя сделать ..., попробую что получится
Ответить с цитированием
  #5 (permalink)  
Старый 13.02.2013, 19:51
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

bogong, походу не о том callback вы подумали )
window.onload=function(){
    notification.render.create(function(){
        console.log(notification.properties.rssFeed);
    });
}
var notification={
 
    properties:{
        rootElement:"noticeContent",               
        listElement:"notificationList",                
        rssUrl:"http://www.server.com/rss/",           
        rssFeed:{},                            
        rssFeedCount:null,                     
    },
 
    render:{
        create:function(onload){
            notification.kinematics.getRss(notification.properties.rssUrl, onload || function(){});
            console.log(notification.properties.rssFeed);
        },
    kinematics:{
        getRss:function(url, onload){
            var rssXml=new XMLHttpRequest();
            rssXml.open("GET",url,true);
            rssXml.send(null);
            rssXml.onreadystatechange=function(){
                if(rssXml.readyState==4){
                    if(rssXml.status==200){
                        var xml=rssXml.responseXML;
                        var count=xml.getElementsByTagName(notification.properties.rssTags.video).length;
                        notification.properties.rssFeedCount=count;
                        for(i=0;i<count;i++){
                            var item=xml.getElementsByTagName(notification.properties.rssTags.video)[i];
                            if(item.getElementsByTagName(notification.properties.rssTags.priority)[0].textContent=="1"){
                                notification.properties.currentTumb=i;
                            }
                            notification.properties.rssFeed[i]={
                                title:item.getElementsByTagName(notification.properties.rssTags.title)[0].textContent,
                                linkToPage:item.getElementsByTagName(notification.properties.rssTags.linkToPage)[0].textContent,
                                linkToImage:item.getElementsByTagName(notification.properties.rssTags.linkToImage)[0].textContent,
                                description:item.getElementsByTagName(notification.properties.rssTags.description)[0].textContent,
                                pubDate:item.getElementsByTagName(notification.properties.rssTags.pubDate)[0].textContent,
                                priority:item.getElementsByTagName(notification.properties.rssTags.priority)[0].textContent
                            };
                        }
                        onload();
                    }else{return false}
                }else{return false}
            }
        }
}
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как передать элемент jquery в конструктор объекта? nip jQuery 5 09.10.2012 13:08
Как изменить хтмл без потери значений. PashPP Общие вопросы Javascript 2 04.08.2012 23:34
Как ключу объекта приравнять значение другого ключа? AquaGen Общие вопросы Javascript 3 20.08.2011 18:16
Объект как свойство объекта Cooskon Общие вопросы Javascript 6 16.02.2010 21:41
как узнать тип значения объекта? VHS Общие вопросы Javascript 1 07.01.2009 23:57