2017-02-20 58 views
1

有人可以幫助我理解這兩行代碼,並改進它們以實際允許我停止重複嗎?瞭解javascript承諾與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'用'功能(input){doAthing}',然後看看你是否明白它的作用。 –

+0

這是打算成爲某種異步輪詢的?像「每隔n秒運行一次異步功能」? – SimpleJ

回答

4

第一行(等待)只是等待一定數量的毫秒,然後結束。

第二行(重複)的程序的功能,以在(setInterval的)一定的時間間隔運行,然後調用wait並傳遞重複功能將其設置的毫秒數。這些功能只被調用一次。 JavaScript的對setInterval的內部控制是在設定的時間間隔調用() => 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,並調用clearInterval作爲SimpleJ指出的。 您可能會希望在Promise完成後執行此操作。因此,一個完整的工作示例是:

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調用傳遞給它的任何可交換對象中的所有promisses。在這種情況下,只有一個元素(myfunction)的數組。我創建了一個簡單的函數,只將「重複」寫入控制檯,作爲該函數。但是,如果所有的函數都返回promisses,則可以傳遞任意數量的函數。

你可以看到它在這裏工作:https://jsfiddle.net/9n2knxdg/7/

2

你可以解決的間隔從setInterval一次wait結束在repeat返回,並與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函數。