当前位置: 首页 > 面试题库 >

失败前轮询结果n次(尝试之间有延迟)

夹谷成仁
2023-03-14
问题内容

我们需要编写一个Node.js函数,该函数轮询某个API端点以获取先前请求的计算结果。结果需要一个随机的时间才能生成,而可能根本不生成。我们希望尽快得到它,但是我也不想等待太久,这意味着在一定数量的API调用之后,我们希望函数失败(拒绝Promise)。

我们的代码和API之间存在一种通信方式。

const Bluebird = require('bluebird');

function getResult() {
  return new Bluebird(async function (resolve, reject) {

    let counter = 0;

    while (counter < 10) {
      await Bluebird.delay(1000);

      const res = await apiCall();
      if (res.data) {
        resolve(res.data);
      } else {
        counter += 1;
      }
    }

    reject('timeout');
  });
}

这是正确的方法吗?


问题答案:

否。这是Promise构造函数antipattern的async/await版本!当您调用时resolve,它甚至不会停止循环,或者在引发异常时(例如,当resis null)拒绝它。
你应该用

async function getResult() {
  for (let counter = 0; counter < 10; counter += 1) {
    await Bluebird.delay(1000);
    const res = await apiCall();
    if (res.data) {
      return res.data;
    }
  }
  throw new Error('timeout');
}

如果您要确保返回的是Bluebird承诺,而不是本地的,则将其包装Bluebird.method或告诉您的翻译者使用Bluebird。



 类似资料:
  • 我有一个Spring MVC 3.2应用程序,我需要在此Web服务中添加一个长轮询以进行实时聊天。我关注了这篇文章Spring MVC 3.2 Preview: Chat Sample。 TopicRestController: 现在的问题是: 当我调用“/{topicId}/updates”时,如果在30秒后没有任何答案,服务器返回错误500,如果有人写了一条消息,服务器返回正确的消息,但服务器

  • 在执行Cassandra操作(批量执行-在两个表上插入和更新操作)时,我收到“所有主机都尝试查询失败-com。数据。驱动程序。核心。操作时间异常”错误。 群集信息: 卡桑德拉 2.1.8.621 |DSE 4.7.1 火花-卡桑德拉-连接器-java_2.10 版本 - 1.2.0-rc1 | 卡桑德拉驱动器核心版本 - 2.1.7 火花 1.2.1 |Hadoop 2.7.1 = 在搜索它的解决

  • 我实现了以下代码来处理我未来的完成,它编译得很好 我对它的工作原理有点困惑,我假设它确实如此,因为我从Scala文档中的类似示例中复制了它 我知道onComplete需要一个函数,该函数将尝试作为输入,成功和失败都是从尝试扩展而来的case类 我不明白的是,如果不首先进行某种类型的匹配,你怎么能在这些情况下进行。 这怎么可能在这里?

  • 我用以下beforeAll代码进行了量角器测试: 登录页面是Microsoft Azure Ad,它没有角度,因此需要禁用。 有时会失败(这是我正在解决的问题)。然而,当它失败时,所有的测试都会运行,当然也会超时,因为它们会出现在登录屏幕上。 有没有什么我可以调用beforeAll()来说“这里的每个场景都失败”?

  • 我开始使用Cassandra,我可以连接“cmd”,我安装了Java和python。(我的密钥空间名是Alvaro,我的表名是alumnos)我有这个问题 我的程序很简单,我只想连接和插入。 ' 如果我只运行1-8行的应用程序,它不会坏。但是我无法连接,我已经尝试了一周,安装了很多罐子,但我的罐子是。 C:\apache-cassandra-3.0.18-bin\cassandra_jars\ca

  • 背景: 有两项活动 1x(主活动),1x(子活动-具有列表视图的活动) 主活动扩展了碎片活动,信息将在碎片中使用 单击主活动的菜单项时,子活动将打开 为ListView使用HashMap 我的目标: 单击项的HashMap值应发送回主活动,子活动(带有ListView)应关闭 问题: 我认为我犯了一个巨大的错误,但我无法解决它。 从onOptionsItemSelected和onActivityR