setInterval()을 사용한 간단한 연속 폴링 실행
사용자에게 제시되는 데이터의 일부를 정해진 간격으로 갱신해야 하는 간단한 웹 앱의 경우 단순히 사용하는 것에 단점이 있습니까?setInterval()
적절한 폴링 프레임워크를 사용하지 않고 엔드포인트에서 JSON을 취득할 수 있습니까?
예를 들어 처리 작업의 상태를 5초마다 새로 고친다고 가정해 보겠습니다.
제 코멘트부터:
이전 답변이 오면 항상 사용하고[아쉬움] 전화하겠습니다.이렇게 하면 요구/응답 시간이 간격보다 길어질 경우에 대비하여 congestion나 함수 스택 또는 호출하고 싶은 모든 것을 피할 수 있습니다.
예를 들어 다음과 같습니다.
function refresh() {
// make Ajax call here, inside the callback call:
setTimeout(refresh, 5000);
// ...
}
// initial call, or just call refresh directly
setTimeout(refresh, 5000);
Promise를 사용하여 최근 브라우저에서 간단한 논블로킹 폴링 기능을 구현할 수 있습니다.
var sleep = duration => new Promise(resolve => setTimeout(resolve, duration))
var poll = (promiseFn, duration) => promiseFn().then(
sleep(duration).then(() => poll(promiseFn, duration)))
// Greet the World every second
poll(() => new Promise(() => console.log('Hello World!')), 1000)
다음과 같이 할 수 있습니다.
var i = 0, loop_length = 50, loop_speed = 100;
function loop(){
i+= 1;
/* Here is your code. Balabala...*/
if (i===loop_length) clearInterval(handler);
}
var handler = setInterval(loop, loop_speed);
@bschlueter의 답변을 수정하기만 하면 됩니다.예, 이 폴링 기능은 전화로 취소할 수 있습니다.cancelCallback()
let cancelCallback = () => {};
var sleep = (period) => {
return new Promise((resolve) => {
cancelCallback = () => {
console.log("Canceling...");
// send cancel message...
return resolve('Canceled');
}
setTimeout(() => {
resolve("tick");
}, period)
})
}
var poll = (promiseFn, period, timeout) => promiseFn().then(() => {
let asleep = async(period) => {
let respond = await sleep(period);
// if you need to do something as soon as sleep finished
console.log("sleep just finished, do something...");
return respond;
}
// just check if cancelCallback is empty function,
// if yes, set a time out to run cancelCallback()
if (cancelCallback.toString() === "() => {}") {
console.log("set timout to run cancelCallback()")
setTimeout(() => {
cancelCallback()
}, timeout);
}
asleep(period).then((respond) => {
// check if sleep canceled, if not, continue to poll
if (respond !== 'Canceled') {
poll(promiseFn, period);
} else {
console.log(respond);
}
})
// do something1...
console.log("do something1...");
})
poll(() => new Promise((resolve) => {
console.log('Hello World!');
resolve(); //you need resolve to jump into .then()
}), 3000, 10000);
// do something2...
console.log("do something2....")
오래된 질문인 것은 알지만, 우연히 알게 되었습니다.StackOverflow의 작업 방식에서는 개선할 수 있다고 생각했습니다.여기서 설명하는 것과 유사한 솔루션(롱 폴링)을 고려해 보는 것이 좋습니다.또는 WebSockets(모든 브라우저에서 작업하는 것을 주요 목표로 하는 웹소켓의 더 나은 구현 중 하나) socket.io도 있습니다.
첫 번째 솔루션은 기본적으로 단일 AJAX 요청을 전송하고 응답을 기다린 후 추가 요청을 전송하면 요약되며, 응답이 전달되면 다음 쿼리를 큐잉합니다.
한편 백엔드에서는 상태가 변경될 때까지 응답을 반환하지 않습니다.따라서 시나리오에서는 상태가 변경될 때까지 계속되는 while 루프를 사용한 후 변경된 상태를 페이지로 되돌립니다.저는 이 솔루션이 정말 마음에 들어요.위에 링크된 답변에서 알 수 있듯이, 이것이 Facebook이 하는 일(또는 적어도 과거에 했던 일)
socket.io은 기본적으로 웹소켓의 jQuery이기 때문에 사용자가 어떤 브라우저를 사용하든 데이터를 페이지에 푸시할 수 있는 소켓 연결을 확립할 수 있습니다(폴링 없이).이는 Blackberry의 즉각적인 알림에 가깝습니다. 즉석 알림을 받으려면 이 방법이 가장 좋습니다.
언급URL : https://stackoverflow.com/questions/8682622/using-setinterval-to-do-simplistic-continuous-polling
'programing' 카테고리의 다른 글
JSONObject에서 값 유형을 확인하려면 어떻게 해야 합니까? (0) | 2023.02.22 |
---|---|
사용자가 뒤로 버튼을 사용하여 페이지에 접속했는지 여부를 감지하려면 어떻게 해야 합니까? (0) | 2023.02.22 |
null과 undefined를 모두 확인할 수 있는 방법이 있을까요? (0) | 2023.02.22 |
WordPress 로딩 jQuery 및 jQuery-migrate를 중지하려면 어떻게 해야 합니까? (0) | 2023.02.22 |
RestTemplate가 응답 표현을 PagedResources에 바인드하지 않는 이유는 무엇입니까? (0) | 2023.02.22 |