請問各位學長學姐
這個錯誤要怎麼改啊
謝謝
$(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'));
}
data没有传到方法里面去,可以定义一个全局变量var data;,然后在获取到data的时候 success: function (data) {
data = data
setTimeout(SetDetail,1000);
setTimeout(displayClock,1000);
setTimeout(displayEvent,1000);
},
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
謝謝各位學長
其實我這樣做只想1秒load一秒data
然後再用不同的function加timer去載入資料
data是 undefined 很正常,ajax預設是異步程式,你很難預測什麼時候data存進去,什麼時候還沒存進全域變數。
所以我才說你越寫越糟,反而一開始那種寫法,把後續更新包在其他函式,然後setInterval會比較容易寫。
弄遞迴我是不太建議...
另外setInterval是可以傳參數給前面要執行的函式的。
然後ajax有一個 timeout,讓你可以作逾時處理。
如果你的重新連線時間(假設5分鐘)大於timeout(30秒),你可以確保你的重新連線不會有問題。
如果你希望即時反應數據,那你需要websocket/Server-Sent Events比較好做,你也只需要一個連線就可以了。而且程式超級好寫簡單易讀。
謝謝學長
我成功了
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);