Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Видимость значений объекта. Как? (https://javascript.ru/forum/misc/35526-vidimost-znachenijj-obekta-kak.html)

bogong 13.02.2013 18:36

Видимость значений объекта. Как?
 
Есть скрипт:
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 - все хреново, объект пустой - почему??? Помогите люди добрые ...

bogong 13.02.2013 19:23

Цитата:

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

И я так понимаю, тут придется объединить асинхронность аякса с событием загрузки окна, то есть нужно будет проверять состояние готовности обеих сущностей как из onreadystatechange, так и из onload. И окончательное действие совершать только во второй раз.

А как это объеденить??? Через какой-то внешний маркер и цикл ожидания значения маркера???

danik.js 13.02.2013 19:32

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

а по получению rss - вызывать эту функцию

bogong 13.02.2013 19:43

Цитата:

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

а по получению rss - вызывать эту функцию

callback не получить ..., я забадался с этого сервера нормально заголовки получать ... Там странный прогер сидит Лучше не трогать каллбэк от сервера
я решил попробовать через наблюдателя сделать ..., попробую что получится

danik.js 13.02.2013 19:51

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}
            }
        }
}


Часовой пояс GMT +3, время: 15:32.