2017-04-12 109 views
-1

我有如下功能:如何使用setInterval或setTimeOut同步執行?

function foo(args1, args2, retry) 
{ 
    if (retry <= 0) 
     return false; 

    var isDone = callAnotherFunction(args1, args2); 

    if(!isDone) { 
     setInterval(function() { 
      foo(args1, args2, retry-1); 
     }, 
     2000); 
    } 
    else 
     return true; 
} 

所以我不知道,如果上面的實現是正確的。但是我需要在另一個函數中使用這個函數。並在if塊中使用上述函數來決定是否需要執行其他語句。以下是上述功能的用法。

function useIt(args1, args2) 
{ 
    // Other code 
    let store = function() { 
     if(!foo(args1, args2, 5)) { 
      cleanStorage(args1, args2); 
      return; 
     } 
} 

所以問題是在功能上useIt()cleanStorage()不等待foo()到,如果我使用setIntervalsetTimeOut執行。那麼我該如何執行功能foo()?請幫助我。

+1

爲什麼你需要等待(使用'setInterval')? – suvroc

+0

我正在使用'setInterval',在失敗的情況下我可以重試,並在重試之間添加延遲。 –

+2

雖然你在標題中說過「同步」,但我可以看看使函數foo成爲[promise](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/ Global_Objects/Promise)這樣你就可以等待'useIt'函數中'foo'的結果 – George

回答

3

您應該使用Promises做到這一點

事情是這樣的:

function foo(args1, args2, retry) 
{ 
    return new Promise(function(resolve, reject) { 
    if (retry <= 0) 
     reject(); 

    var isDone = callAnotherFunction(args1, args2); 

    if(!isDone) { 
     setInterval(function() { 
      retry = retry - 1; 
      isDone = callAnotherFunction(args1, args2); 
      if (isDone) 
       resolve(); 
     }, 
     2000); 
    } 
    else 
     resolve(); 
    } 
} 

function useIt(args1, args2) 
{ 
    // Other code 
    let store = function() { 
    foo(args1, args2, 5).then(result => { 
      cleanStorage(args1, args2); 
      return; 
     } 
    } 
} 
2

考慮使用promises

FOO可以寫成這樣(我更換setIntervalsetTimeout):

function foo(args1, args2, retry) { 
    return new Promise(function (resolve, reject) { 
    if (retry <= 0) 
     reject(); 

    var isDone = callAnotherFunction(args1, args2); 

    if (!isDone) { 
     setTimeout(function() { 
     resolve(foo(args1, args2, retry - 1)); 
     }, 2000); 
    } 
    else 
     resolve(true); 
    }) 
} 

然後像這樣使用它:

function useIt(args1, args2) { 
    // Other code 
    let store = function() { 
    foo(args1, args2, 5).then(function() { 
     cleanStorage(args1, args2); 
    }); 
    } 
} 
+0

如果foo確實返回了承諾,'!foo(...)'將始終爲假。您需要使用'.then'或'await'實際等待承諾。 – Bergi

+0

感謝@Bergi,快速點擊提交按鈕 – thedude

+0

但是'拒絕'從未被使用過。 –