笑话断言承诺递归

时间:2020-02-04 13:22:44

标签: javascript jestjs

我具有这个异步功能,可以在某些情况下重试Promise。

async function retry(f, interval = 1000, retries = 10) {
try {
  return await f
} catch (e) {
  if (retries == 0) {
    throw e
  }

  setTimeout(() => {
    retry(f, Math.min(60000, interval * 2), retries - 1);
  }, interval);
}

}

我想用玩笑来断言在函数被抛出之前递归执行的次数。这是函数调用。

const f = new Promise((resolve, reject) => reject('test'))

retry(f)

1 个答案:

答案 0 :(得分:2)

f应该是重试时可以调用的函数。 Promise只会解析/拒绝一次,然后保持该状态。使用功能可以让您重做想要尝试的事情。

f是一个函数时,它本身可以是一个闭包,计算其被调用的次数。例如:

function delay(t) {
  return new Promise(resolve => {
    setTimeout(resolve, t);
  });
}
async function retry(f, interval = 100, retries = 10) {
  try {
    return await f();
  } catch (e) {
    if (retries == 0) {
      throw e;
    }
    await delay(interval);
    return retry(f, Math.min(60000, interval * 2), retries - 1);
  }
}

describe("retry", () => {
  it("retries 10 times", async () => {
    let count = 0;
    const f = () => {
      count++;
      return Promise.reject(`test ${count}`);
    };

    try {
      await retry(f);
    } catch (e) {
      // expect the last exception to be thrown
      expect(e).toEqual("test 11");
    }
    // 10 retries + first try = 11
    expect(count).toBe(11);
  });
});
相关问题