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

时间:2017-04-12 07:45:19

标签: javascript node.js promise settimeout setinterval

我有如下功能:

LIKE

所以我不确定上述实现是否正确。但我需要在另一个函数中使用此函数。并在if块中使用上述函数来决定是否需要执行其他语句。以下是上述功能的用法。

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

问题在于功能function useIt(args1, args2) { // Other code let store = function() { if(!foo(args1, args2, 5)) { cleanStorage(args1, args2); return; } } ,如果我使用useIt()cleanStorage(),则foo()不会等待setInterval执行。那么我该如何实现函数setTimeOut?请帮助我。

2 个答案:

答案 0 :(得分:4)

您应该使用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;
        }
    }
}

答案 1 :(得分:3)

考虑使用promises

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