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

Javascript 链接超时导致上次超时被拒绝?,javascript,node.js,promise,q,bluebird,Javascript,Node.js,Promise,Q,Bluebird,我目前正试图将一些承诺与超时联系起来,无论达到哪一个超时,它都会报告最后一个。我用蓝鸟和Q试了一下,结果是一样的,所以我想我有一个普遍的问题 代码基本上如下所示: var Promise=require('bluebird'); 承诺.延迟(2000年) .然后(函数(){ 返回承诺。延迟(2000年); }) .超时(1000,“超时1”) .然后(函数(){ 返回承诺。延迟(500); }) .超时(1000,“超时2”) .然后(函数(){ 返回承诺。延迟(500); }) .超时(10

我目前正试图将一些承诺与超时联系起来,无论达到哪一个超时,它都会报告最后一个。我用蓝鸟和Q试了一下,结果是一样的,所以我想我有一个普遍的问题

代码基本上如下所示:

var Promise=require('bluebird');
承诺.延迟(2000年)
.然后(函数(){
返回承诺。延迟(2000年);
})
.超时(1000,“超时1”)
.然后(函数(){
返回承诺。延迟(500);
})
.超时(1000,“超时2”)
.然后(函数(){
返回承诺。延迟(500);
})

.超时(1000,“超时3”)蓝鸟不保证计时器的执行顺序。因此,如果您将三个超时设置为相同的时间跨度,我们不会强制执行哪个超时。如您所见,如果在浏览器中运行此代码,则“超时1”将记录,而不是超时3:

var p=Promise.delay(2000年)
.然后(函数(){
返回承诺。延迟(2000年);
})
.超时(1000,“超时1”)
.然后(函数(){
返回承诺。延迟(500);
})
.超时(1000,“超时2”)
.然后(函数(){
返回承诺。延迟(500);
})
.超时(1000,“超时3”);
p、 反射()。然后(函数(res){
document.body.innerHTML=JSON.stringify(res.reason().message);
});

延迟
超时
使用node.js中环境的
设置超时
功能,该功能绝对不能保证计时器的运行顺序。您基本上需要假设一个
setTimeout(…,10)
可能在
setTimeout(…,10000)
之后运行,因此使您的代码依赖于较早的计时器在较晚的计时器中断后运行。

当前您有3个超时,所有这些超时都要求所有(整个链)在1s内完成。
我有一种感觉,你实际上想要为每个连续的任务做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。

当您在同一时间段内有多个超时时,就我所知,无法保证他们将运行的订单。@BenjaminGruenbaum事实上,即使他们没有相同的时间段,也无法保证。因此,以这种方式使用计时器根本不起作用:>实际上-在浏览器中它是指定的,引用timers spec的相关部分:
等待,直到在超时等于或小于此算法的调用之前启动此算法的任何调用完成。
-没有保证的是node:
node.js不保证回调启动的确切时间,也不会触发任何订购物品。
@BenjaminGruenbaum这解释了为什么我总是在浏览器中获得超时1。。。但是op使用的是node.js索引,这正是我想要做的。我昨天也试过类似的方法,但似乎弄错了。现在它开始工作了。非常感谢。