它们都是一样的。
您提供的第一个示例,如果完整编写,将如下所示:
函数睡眠(毫秒){
返回新的承诺((解决)=> {
返回 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)
}
只用简写。
补充答案。
你问
那么如果 resolve 是一个函数,是不是因为它从未实现而被跳过?
你错了。它从来没有被实施过。它由编写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);
}
}