Javascript 什么是决心';功能';在最佳实践中?

Javascript 什么是决心';功能';在最佳实践中?,javascript,promise,settimeout,Javascript,Promise,Settimeout,在学习javascript中的异步时,我遇到了javascript中sleep()函数的最佳实践 function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } 在w3school的setTimeout文档中,它说第一个参数必须是一个函数,当计时器解析时将调用该函数。所以,如果resolve是一个函数,它只是因为从未实现而被跳过吗 这到底是怎么回事?如果这是显而易见的,我有点诵读困难,非常

在学习javascript中的异步时,我遇到了javascript中sleep()函数的最佳实践

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