【问题标题】:How to execute synchronously using setInterval or setTimeOut?如何使用 setInterval 或 setTimeOut 同步执行?
【发布时间】:2017-04-12 07:45:18
【问题描述】:

我有一个功能如下:

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(),如果我使用setIntervalsetTimeOutcleanStorage() 不会等待foo() 被执行。那么我需要如何实现函数 foo() 呢?请帮助我。

【问题讨论】:

  • 为什么需要等待(使用setInterval)?
  • 我正在使用setInterval,在发生故障时我可以重试,并在重试之间添加延迟。
  • 虽然你在标题中说过“同步”,但我会看看将函数 foo 设置为 promise 这样你就可以等待来自 foo 的结果useIt函数
  • 我不确定为什么会有反对票,因为我找不到任何重复的问题。请添加评论,说明为什么该问题被否决。

标签: javascript node.js promise settimeout setinterval


【解决方案1】:

考虑使用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);
    });
  }
}

【讨论】:

  • 如果 foo 确实返回了一个承诺,!foo(…) 将始终为 false。您实际上需要使用.thenawait 等待承诺。
  • reject 从未被使用过。
  • @SuhasKulkarni 我已经编辑了代码来展示如何使用拒绝。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-27
    • 2012-02-04
    • 2021-11-08
    相关资源
    最近更新 更多