Javascript 什么是决心';功能';在最佳实践中?
在学习javascript中的异步时,我遇到了javascript中sleep()函数的最佳实践Javascript 什么是决心';功能';在最佳实践中?,javascript,promise,settimeout,Javascript,Promise,Settimeout,在学习javascript中的异步时,我遇到了javascript中sleep()函数的最佳实践 function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } 在w3school的setTimeout文档中,它说第一个参数必须是一个函数,当计时器解析时将调用该函数。所以,如果resolve是一个函数,它只是因为从未实现而被跳过吗 这到底是怎么回事?如果这是显而易见的,我有点诵读困难,非常
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
在w3school的setTimeout
文档中,它说第一个参数必须是一个函数,当计时器解析时将调用该函数。所以,如果resolve是一个函数,它只是因为从未实现而被跳过吗
这到底是怎么回事?如果这是显而易见的,我有点诵读困难,非常抱歉。带有单个参数的参数列表周围的括号是可选的。这两个语法完全相等:
resolve => …
(resolve) => …
您使用哪一种是一种风格偏好,而不是最佳实践的问题
带有多个参数的箭头函数参数列表始终需要括号
const add = (a, b) => a + b;
add(1, 2)
// returns 3
括号并不表示函数调用,就像
(ms)
不是函数睡眠(ms)
中的函数调用一样,它们都是相同的
您提供的第一个示例(如果完整编写)如下所示:
功能睡眠(ms){
返回新承诺((解决)=>{
return setTimeout(解析,毫秒)
});
}
(注意:这是您的第一个函数,而不是第二个函数-尽管它们基本相同,但我想强调的是,这是对第一个函数的重写)
也就是说,您正在传递匿名函数:
(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);
}
}
啊,我明白了,但这仍然不能回答我的问题,我将编辑我的问题clarity@Sujio:
resolve=>setTimeout(resolve,ms)
是一个函数。这就像函数startSomePromiseWork(resolve){setTimeout(resolve,ms);}
后面跟着返回新承诺(startSomePromiseWork)代码>。我明白了。另外一个答案就是我一直在寻找的。我一定是在阅读文档时错过了它。非常感谢。
(resolve) => {
return setTimeout(resolve, ms)
}
// 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);
}
}