Javascript 保证过快接到电话?
鉴于以下功能:Javascript 保证过快接到电话?,javascript,Javascript,鉴于以下功能: function makeTimeout(delay=3000) { return new Promise(resolve => { setTimeout(() => { console.log(`I delayed for ${delay} seconds`); resolve(`I delayed for ${delay} seconds`) }, delay) }
function makeTimeout(delay=3000) {
return new Promise(resolve => {
setTimeout(() => {
console.log(`I delayed for ${delay} seconds`);
resolve(`I delayed for ${delay} seconds`)
}, delay)
})
}
当我运行makeTimeout(5000)。然后(makeTimeout(6000))。然后(makeTimeout(200))代码>,,
我回来了:
I delayed for 200 seconds
I delayed for 5000 seconds
I delayed for 6000 seconds
当解释器正在构建承诺链的过程中时,是否应该按顺序执行这些操作,并且第二个操作在末尾?您正在立即调用最后两个makeTimeout
s。将回调传递给。然后改为
,返回新承诺:
makeTimeout(5000)
.then(() => makeTimeout(6000))
.then(() => makeTimeout(200));
实时片段:
函数makeTimeout(延迟=300){
返回新承诺(解决=>{
设置超时(()=>{
log(`I delayed for${delay}seconds`);
解析(`I延迟了${delay}秒`)
},延误)
})
}
makeTimeout(500)
.然后(()=>makeTimeout(600))
.然后(()=>makeTimeout(20))
。然后
接受两个参数,(onResolved,onRejected)
-这两个参数都应该是函数
立即调用makeTimeout(100)
,并返回一个承诺
,而不是函数
将其他内容传递给并不是一个错误。然后,
作为一件事,这就是.catch
的工作方式-在大多数promise库中,.catch(onReject)
只是。然后(null,onReject)
-。然后,
简单地忽略不是函数的参数,而不中断链
i、 e
或
将像一样工作。那么(null,null)
根本就不存在
为了完整性起见,您还可以更改makeTimeout
以返回函数-因为。然后
会忽略任何不是函数的参数
注意:makeTimeout(5000)()中的额外()
。然后
它同样有效——不过,对于这样简单的代码,我不会使用这种模式
函数makeTimeout(延迟=3000){
return()=>新承诺(resolve=>{
设置超时(()=>{
log(`I delayed for${delay}seconds`);
解析(`I延迟了${delay}秒`)
},延误)
})
}
makeTimeout(5000)然后(makeTimeout(6000)),然后(makeTimeout(200))代码>我尝试了这个,现在它可以工作了:
makeTimeout(5000)
.then(() => makeTimeout(6000))
.then(() => makeTimeout(200));
但是分离到多行会使它们失去顺序…为什么
makeTimeout(5000)
.then(() => {
makeTimeout(6000)
})
.then(() => {
makeTimeout(200)
});
不,因为您在开始时进行所有超时,然后将结果作为传递。然后进行“回调”。makeTimeout(6000)
的结果不是函数(这是唯一的结果。然后接受)。。。这需要一个函数,谢谢!接受您的答案并发布了一个答案,但当将其移动到多行时,关于它的问题会有所不同。如果我应该删除它,请让我知道在大多数情况下,空白并不重要,它应该可以很好地使用或不使用空白-请参阅代码片段。我只是为了可读性而将其设置为多行,因为在第二个代码中,您没有返回延迟后解析的承诺-()=>语句
与()=>{statement;}
-它与()=>{return statement;}
相同,在单行语法上有一个隐式返回…抱歉
makeTimeout(5000)
.then(() => makeTimeout(6000))
.then(() => makeTimeout(200));
makeTimeout(5000)
.then(() => {
makeTimeout(6000)
})
.then(() => {
makeTimeout(200)
});