iT邦幫忙

0

Ajax Uncaught TypeError: data is undefined

  • 分享至 

  • xImage

請問各位學長學姐
這個錯誤要怎麼改啊
謝謝

$(document).ready(function () {
setTimeout(SetDetail,1000);
 });
function SetDetail(){
    $.ajax({
        crossDomain: true,
        url: "/data",
        type: "GET",
        dataType: 'json',
        success: function (data) {
            setTimeout(SetDetail,1000);
			setTimeout(displayClock,1000);
			setTimeout(displayEvent,1000);
        },
        error: function(){
            //setTimeout(SetDetail,1000);  
			alert('error');
        }
    });
}
		
			
			
function displayClock(data) {             
                $('.timestamp').text(data.time);
                setTimeout(displayClock, 1000);
				console.log('Clock'+new Date().toLocaleTimeString('en-GB'));
            }			
			
function displayEvent(data) {  
                        $(".event div").html('');
						var events = data.event;
                        $.each(events, function (i, order) {
                            $(".event div").append('<p>' + events[i].start_at + '~' + events[i].close_at + '<br>' + events[i].name + ' / ' + events[i].place + '</p>');
                        });
                setTimeout(displayEvent, 1000*60*5);
				console.log('Event'+new Date().toLocaleTimeString('en-GB'));
            }
看更多先前的討論...收起先前的討論...
froce iT邦大師 1 級 ‧ 2021-11-03 11:47:23 檢舉
你這哪有5分鐘更新一次?
.dynamic 會在接收到ajax後先更新一次結果,5分鐘後再並且"只"更新一次"同樣的結果"。

程式本身寫法大概就這樣沒錯,沒啥累贅的問題。
但是程式本身是錯的,這問題才大。

真要弄成很炫炮的樣子,去學RXJS,這種時間流處理RXJS是專門的。
carlkyo iT邦新手 5 級 ‧ 2021-11-03 12:14:49 檢舉
改好了
找到這個
https://ithelp.ithome.com.tw/questions/10199611
我再研究一下好了
Homura iT邦高手 1 級 ‧ 2021-11-03 14:52:30 檢舉
你API沒丟資料回來嗎?
froce iT邦大師 1 級 ‧ 2021-11-03 14:53:14 檢舉
...你越改越糟糕

1. data這個變數你沒搞懂scope
2. setTimeout只會執行一次,你想要的應該是 setInterval
3. 你5分鐘才更新一次,應該是不用擔心上面你丟的網頁說的問題
Homura iT邦高手 1 級 ‧ 2021-11-03 15:04:24 檢舉
仔細一看你根本沒把回傳的Data丟進function啊...
froce iT邦大師 1 級 ‧ 2021-11-03 15:19:47 檢舉
所以我才說他越改越糟糕啊...
他本來的code是能動的,只是弄錯setInterval/setTimeout
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

1
h2102469
iT邦見習生 ‧ 2021-11-03 15:47:45

data没有传到方法里面去,可以定义一个全局变量var data;,然后在获取到data的时候 success: function (data) {
data = data
setTimeout(SetDetail,1000);
setTimeout(displayClock,1000);
setTimeout(displayEvent,1000);
},

carlkyo iT邦新手 5 級 ‧ 2021-11-04 08:16:13 檢舉
		var data;
function SetDetail(){
    $.ajax({
        crossDomain: true,
        url: apiUrl + "/kiosk/api",
        type: "GET",
        dataType: 'json',
        success: function (data) {
			data = data;		
            setTimeout(SetDetail,1000);            // 跑完上述工作......再設定一次timeout,周而復始,保証不會同時有兩個ajax在工作
        }
    });
}
function test(data){
	var data = data;
	console.log(data)
}
//這個搬進document ready裡
$(document).ready(function () {
    setTimeout(SetDetail,1000);  // ←只讓他跑一次		
	setInterval(test, 2000);
});

我這樣改兩個都有連續執行
但那個回傳的data還是undefined
謝謝各位學長/images/emoticon/emoticon41.gif
其實我這樣做只想1秒load一秒data
然後再用不同的function加timer去載入資料

froce iT邦大師 1 級 ‧ 2021-11-04 10:45:24 檢舉

data是 undefined 很正常,ajax預設是異步程式,你很難預測什麼時候data存進去,什麼時候還沒存進全域變數。
所以我才說你越寫越糟,反而一開始那種寫法,把後續更新包在其他函式,然後setInterval會比較容易寫。
弄遞迴我是不太建議...

另外setInterval是可以傳參數給前面要執行的函式的。

然後ajax有一個 timeout,讓你可以作逾時處理。
如果你的重新連線時間(假設5分鐘)大於timeout(30秒),你可以確保你的重新連線不會有問題。

如果你希望即時反應數據,那你需要websocket/Server-Sent Events比較好做,你也只需要一個連線就可以了。而且程式超級好寫簡單易讀。

carlkyo iT邦新手 5 級 ‧ 2021-11-04 13:58:15 檢舉

謝謝學長/images/emoticon/emoticon41.gif
我成功了
websocket/Server-Sent Events好像很複雜而且有限制


var data;
setInterval(function() {
    $.ajax({
        url: api,
        dataType: "JSON",
        data:{},
        success: function(x){
            data = x;
        }
    });
}, 1000);


setInterval(function() {
		console.log(data);
    }, 2000);

我要發表回答

立即登入回答