2017-02-20 9 views
1

누군가이 두 줄의 코드를 이해하고 실제로 반복 기능을 중지하도록 향상시킬 수 있습니까? 당신은 간격을 해결할 수setTimeout 및 setInterval과 함께 사용되는 자바 스크립트 약속 이해하기

var wait = ms => new Promise(r => setTimeout(r, ms)); 
var repeat = (ms, func) => new Promise(r => (setInterval(func, ms), wait(ms).then(r))); 

repeat(1000,() => Promise.all([myfunction()]) 
    .then(...) 
+1

https://jsfiddle.net/daronwolff/n10n17ag/ –

+1

화살표 표기법을 교체, "고전적인"ES 표기에 그들을 쓰기'입력 => doAthing'와'기능을 (입력) {doAthing}'을 확인한 다음 그 내용을 이해하는지 확인하십시오. –

+0

이것은 일종의 비동기 폴링을위한 것입니까? "n 초마다 비동기 함수를 실행"하는 것과 같은가? – SimpleJ

답변

4

첫 번째 줄 (대기)은 특정 밀리 초를 기다린 다음 끝납니다.

두 번째 줄 (반복)은 특정 시간 간격 (setInterval)에 실행될 함수를 프로그래밍 한 다음 wait를 호출하고 반복 함수에 설정된 밀리 초 수를 전달합니다. 이 함수는 한 번만 호출됩니다. setInterval에 대한 Javascript의 내부 컨트롤은 프로그래밍 된 시간 간격으로 () => Promise.all([myfunction()])을 호출 할 때부터 지금까지 제어권을 얻는 것입니다.

코드를 식별하면 명확 해집니다.

var wait = 
    ms => new Promise(
     r => setTimeout(r, ms) 
    ); 

var repeat = 
    (ms, func) => new Promise(
     r => (
      setInterval(func, ms), 
      wait(ms).then(r) 
     ) 
    ); 

repeat(1000,() => Promise.all([myfunction()])) 
.then(...); 

기능을 중지하려면 간격의 ID를 캡처하고 SimpleJ가 지적한대로 clearInterval을 호출해야합니다. 일단 당신이 그걸 가지고 다닌다면 약속으로 이것을하기를 원할 것입니다. 따라서 완전한 예제는 다음과 같습니다 :

var intervalID = 0; 

var wait = 
    ms => new Promise(
     r => setTimeout(r, ms) 
    ); 

var repeat = 
    (ms, func) => new Promise(
     r => (
      intervalID = setInterval(func, ms), 
      wait(ms).then(r) 
     ) 
    ); 

var myfunction = 
    () => new Promise(
     r => r(console.log('repeating...')) 
    ); 

var stopAfter5Secs = 
    () => new Promise(
     r => r(setTimeout(() => { 
        clearInterval(intervalID); 
        console.log('repeat end') 
       } , 5000)) 
    ); 

repeat(1000,() => Promise.all([myfunction()])) // 1000 miliseconds = 1 second 
.then(stopAfter5Secs()) // starts timer to end repetitions 
.then(console.log('repeat start')); // informs that all actions were started correctly and we are waiting for them to finish 

Promiss.all은 전달 된 인터 테이블 객체의 모든 promiss를 호출합니다. 이 경우 요소가 하나만있는 배열 (myfunction). 콘솔에 '반복'만 쓰는 간단한 함수를 만들었습니다. 그러나 모두가 약속을 되 돌리면 원하는 함수를 원하는만큼 전달할 수 있습니다.

현재 작업을 볼 수 있습니다 https://jsfiddle.net/9n2knxdg/7/

2

repeatsetIntervalwait 한 번 완료에서 반환 및 clearInterval와 간격을 취소 :

var wait = (ms) => new Promise((resolve) => setTimeout(resolve, ms)); 
 

 
var repeat = (ms, func) => new Promise((resolve) => { 
 
    const interval = setInterval(func, ms); 
 
    wait(ms).then(() => resolve(interval)); 
 
}); 
 

 
repeat(1000,() => console.log("Repeated")) 
 
    .then((interval) => { 
 
    console.log("Stopping repeat"); 
 
    clearInterval(interval); 
 
    });

을 나는 목적을 이해 모르겠습니다 만 repeat 함수 중 하나입니다.

관련 문제