javascript - 如何使用 setInterval(with clearInterval)使用 Bluebird Promises 发送请求?

标签 javascript node.js promise bluebird node-request

我正在使用 node-request用于将请求发送到服务器以获取一些报告。问题是服务器需要一些时间来生成报告,因此它会以报告状态进行响应。我正在使用 setInterval() 函数检查报告状态,并在服务器发送 ready 响应时使用 clearInterval()。但是使用这种方法,即使在我使用 clearInterval 之后,早期请求的响应也会不断出现,并且响应处理程序会一次又一次地运行。这不会造成很大的伤害,但我仍然相信它可以做得更好。

这是我的代码:

checkForReportReady = setInterval =>
  @request URL, options, (err, res, body) =>
    console.log err if err
    body = JSON.parse body

    if body['status'] is 'ready'
      clearInterval checkForReportReady
      @processReport body
  , 1000

我需要的:发出请求,等待响应,检查状态,如果状态不是ready - 在超时后发出另一个请求,重复直到状态响应代码为 ready。如果状态为就绪 - 退出循环(或清除间隔)并运行 @processReport

我尝试做一个promisified请求,并把它放入setInterval,但结果是一样的。

附言我不控制服务器,所以我无法更改它响应或处理报告的方式。

最佳答案

我建议不要将请求放入间隔回调中。当它们 a) 失败 b) 花费比间隔更长的时间时,这会变得很丑陋。

而是将 setTimeout 放入成功处理程序中,并在(且仅当)收到响应后重试。
这对于 promise 来说相当容易:

request = Promise.promisifyAll require 'request'
getReport = () =>
  request URL, options
  .spread (res, body) =>
    body = JSON.parse body
    if body.status is 'ready'
      body
    else
      Promise.delay 1000
      .then getReport # try again

getReport().then(@processReport, (err) -> console.log(err))

关于javascript - 如何使用 setInterval(with clearInterval)使用 Bluebird Promises 发送请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32342073/

相关文章:

javascript - 如何将文本框值发送到 CGI 脚本

javascript - NodeJS/JS - 基于另一个数组排序+高效移动元素

javascript - Bluebird:在一个循环中链接 .then 处理程序

javascript - 将 Javascript 对象值增加 "adding"数组

javascript - 使用ajax请求删除文件

node.js - 使用服务器方法进行内存缓存中的 Hapi 不接受对象作为参数

javascript - AngularJS - promise 重新抛出捕获的异常

javascript - 为什么带有 'await'的这行代码会触发微任务队列处理呢?

javascript - 如何在nodejs中重置json文件

node.js - excel4node lib 自动调整 excel 单元格以适应更长的文本