Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/416.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 保证过快接到电话?_Javascript - Fatal编程技术网

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)
});