programing

setInterval()을 사용한 간단한 연속 폴링 실행

powerit 2023. 2. 22. 23:18
반응형

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

반응형