我正在写一些代码来每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)
我会做这样的事情 -
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构造函数的反模式
| 归档时间: |
|
| 查看次数: |
5189 次 |
| 最近记录: |