在学习 javascript 中的异步时,我遇到了 javascript 中 sleep() 函数的最佳实践。
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
What is the JavaScript version of sleep()?
在 w3school 的 setTimeout 文档中,它说第一个参数必须是一个在计时器解析时将被调用的函数。那么,如果resolve是一个函数,它是否只是因为从未实现而被跳过?
这里到底发生了什么?我有点诵读困难,如果这是显而易见的,我很抱歉。
最佳答案
它们是相同的。
您提供的第一个示例如果完整编写,将如下所示:
函数 sleep (毫秒){ 返回新的 Promise((resolve) => { 返回 setTimeout(解析, 毫秒) }); }
(注意:这是您的第一个函数,而不是第二个 - 尽管它们本质上是相同的,但我想强调这是您的第一个函数的重写)
也就是说,您正在传递匿名函数:
(resolve) => {
return setTimeout(resolve, ms)
}
到 promise
。但是,箭头函数的语法允许一些快捷方式。
第一个快捷方式是,如果函数只有一个语句,您可以省略 {}
。也就是说上面的函数可以简写为:
(resolve) => setTimeout(resolve,ms);
所以
(resolve) => {
return setTimeout(resolve, ms)
}
和
(resolve) => setTimeout(resolve,ms);
功能完全相同,但第二个版本是用简写形式编写的。
另一种快捷方式是,如果函数只接受一个参数,您可以删除参数周围的 ()
。所以上面的函数可以重写为:
resolve => setTimeout(resolve,ms);
请注意,这与以下内容完全相同:
(resolve) => {
return setTimeout(resolve, ms)
}
仅以速记形式书写。
附加答案。
你问了
So if resolve is a function, is it just skipped because its never implemented?
你错了。它并非从未实现过。它是由编写 Promise
类的人实现的。
这是 Promise
类的作用:
如果您将我作为构造函数调用,那么您需要将带有两个参数的函数传递给我。稍后我将使用两个参数来调用您的函数,这两个参数都是您可以调用的函数。如果您调用第一个函数,那么我会认为您没问题。如果您调用第二个函数,那么我将假设存在错误。
这就是全部内容了。这两个参数(通常称为 resolve
和 reject
但您可以将它们命名为任何名称)由 Promise
类定义,并将传递给您的函数当 Promise
类调用您的函数时。
这是我自己的 Promise
类的示例实现,用于演示发生的情况:
// Warning. For illustration purposes only. This class does not
// fully implement the Promise design pattern as specified by ECMA262:
class Promise {
constructor (yourfunction) {
this.result = undefined;
this.error = undefined;
function resolve (x) {this.result = x};
function reject (y) {this.error = y};
yourfunction(resolve,reject); // calling your function!!
}
then (yourcallback) {
yourcallback(this.result);
}
catch (yourcallback) {
if (this.error) yourcallback(this.error);
}
}
关于javascript - Promise settimeout 最佳实践中的解析 'function' 是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65559244/