我想保证bluebird.js的分辨率最小延迟承诺.
举个例子,假设我正在将一个请求包含在一个承诺中.我想要的行为是,如果请求少于5秒,我想人为地将承诺解析的延迟增加到5秒.如果请求超过5秒,我不希望添加任何人工延迟 - 所以它比为每个请求添加静态延迟要复杂一些.所有这一切都应该完全隐藏在承诺的消费者身上 - 他们应该看到承诺在5秒或更长时间内得到解决.
为了演示,我有一个简单的模拟实现示例,它将模拟的请求延迟硬编码为3秒.
我的第一次尝试是这样的 - 使用setTimeout确保在5秒之前没有调用解析回调.
function getTimestamp() {
return new Date().getTime();
}
function makeCallWith3SecondLatency(cb) {
console.log('mocking a call with 3 second latency...');
var mockResult = 'the result';
setTimeout(function() { cb(mockResult); }, 3000);
}
function doSomethingAsync(minDelay) {
return new Promise(function(resolve) {
var calledAt = getTimestamp();
makeCallWith3SecondLatency(function(arg) {
var actualDelay = getTimestamp() - calledAt;
if(actualDelay < minDelay) {
var artificialDelay = minDelay - actualDelay;
console.log('artificially delay another ' + artificialDelay + ' millis'); …Run Code Online (Sandbox Code Playgroud)