使用Promises的"带超时间隔"的好模式是什么

Chr*_*911 10 node.js bluebird

我正在写一些代码来每N ms进行一次资源轮询,这会在M秒后超时.我希望尽可能多地使用Bluebird做出承诺.到目前为止,我提出的解决方案使用节点的间隔,可取消的蓝鸟承诺和蓝鸟的超时功能.

我想知道是否有更好的方法来实现蓝鸟和一般承诺的间隔时间?主要是通过确保间隔在该点停止并且永远不会无限期地继续.

var Promise = require('bluebird');

function poll() {
  var interval;

  return new Promise(function(resolve, reject) {
    // This interval never resolves. Actual implementation could resolve. 
    interval = setInterval(function() {
      console.log('Polling...')
    }, 1000).unref();
  })
    .cancellable()
    .catch(function(e) {
      console.log('poll error:', e.name);
      clearInterval(interval);
      // Bubble up error
      throw e;
    });
}

function pollOrTimeout() {
  return poll()
    .then(function() {
      return Promise.resolve('finished');
    })
    .timeout(5000)
    .catch(Promise.TimeoutError, function(e) {
      return Promise.resolve('timed out');
    })
    .catch(function(e) {
      console.log('Got some other error');
      throw e;
    });
}

return pollOrTimeout()
  .then(function(result) {
    console.log('Result:', result);
  });
Run Code Online (Sandbox Code Playgroud)

输出:

Polling...
Polling...
Polling...
Polling...
poll error: TimeoutError
Result: timed out
Run Code Online (Sandbox Code Playgroud)

vin*_*ayr 5

我会做这样的事情 -

function poll() {
  return Promise.resolve().then(function() {
    console.log('Polling...');
    if (conditionA) {
      return Promise.resolve();
    } else if (conditionB) {
      return Promise.reject("poll error");
    } else {
      return Promise.delay(1000).then(poll);
    }
  })
    .cancellable()
}
Run Code Online (Sandbox Code Playgroud)

还要注意Promise构造函数的反模式

  • 警告:不幸的是,像这样的javascript中的递归最终将使调用堆饱和并导致内存不足异常. (6认同)