链接超时导致上次超时被拒绝?

我目前正试图用超时链接一些承诺,不pipe超时是什么,总是报告最后一个。 我用bluebird和Q做了相同的结果,所以我觉得我有一个普遍的问题。

代码基本如下所示:

var Promise = require('bluebird'); Promise.delay(2000) .then(function() { return Promise.delay(2000); }) .timeout(1000, 'Timeout 1') .then(function() { return Promise.delay(500); }) .timeout(1000, 'Timeout 2') .then(function() { return Promise.delay(500); }) .timeout(1000, 'Timeout 3'); 

我得到“未处理的拒绝超时错误:超时3”。 我想要的是超时1.我尝试每次超时后捕捉,但我也一样。

有没有办法让它工作,而不完全分裂?

目前你有3个超时,都需要你的整个链条在1秒内完成。
我有这样的感觉,你真的想为每个连续的任务做3个超时:

 Promise.delay(2000) .then(function() { return Promise.delay(2000) .timeout(1000, 'Timeout 1'); }) .then(function() { return Promise.delay(500) .timeout(1000, 'Timeout 2'); }) .then(function() { return Promise.delay(500) .timeout(1000, 'Timeout 3'); }); 

3秒后超时1将被拒绝。

蓝鸟对定时器的执行顺序不作任何保证。 所以,如果你设置三个超时设置为同一时间跨度,我们不强制执行哪一个。 正如你可以看到,如果你在浏览器中运行此代码"Timeout 1"将logging,而不是超时3:

 var p = Promise.delay(2000) .then(function() { return Promise.delay(2000); }) .timeout(1000, 'Timeout 1') .then(function() { return Promise.delay(500); }) .timeout(1000, 'Timeout 2') .then(function() { return Promise.delay(500); }) .timeout(1000, 'Timeout 3'); p.reflect().then(function(res){ document.body.innerHTML = JSON.stringify(res.reason().message); }); 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/bluebird/2.9.6/bluebird.js"></script> 

delaytimeout使用node.js中的环境的setTimeout函数绝对不能保证定时器以什么顺序运行。 你基本上需要假设一个setTimeout(..., 10)可能会在setTimeout(..., 10000)之后运行setTimeout(..., 10000)所以你的代码依靠较早的定时器在稍后的定时器被破坏之后运行。