簡體   English   中英

如何使用setInterval或setTimeOut同步執行?

[英]How to execute synchronously using setInterval or 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()函數呢? 請幫助我。

您應該使用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;
        }
    }
}

考慮使用諾言

foo可以這樣重寫(我將setInterval替換為setTimeout ):

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);
    });
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM