承诺 settimeout 最佳实践中的 resolve 'function' 是什么?

what is the resolve 'function' in the promise settimeout best practice?

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

function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

What is the JavaScript version of sleep()?

setTimeout 的 w3school 文档中,它说第一个参数必须是一个函数,该函数将在计时器解析时调用。那么如果 resolve 是一个函数,它是否只是因为它从未实现而被跳过?

这里到底发生了什么?我有点阅读障碍,如果这很明显,我很抱歉。

带有单个参数的 arrow function 参数列表周围的括号是可选的。这两种语法完全等同:

resolve => …
(resolve) => …

您使用哪一个是一种风格偏好,而不是最佳实践问题。

具有多个参数的箭头函数参数列表始终需要括号。

const add = (a, b) => a + b;

add(1, 2)
// returns 3

括号中不表示函数调用,就像(ms)不是function sleep(ms)中的函数调用一样。

它们是一样的。

您提供的第一个示例,如果完整编写,将如下所示:

函数睡眠(毫秒){ return 新承诺((解决)=> { return 设置超时(解决,毫秒) }); }

(注意:这是您的第一个函数,而不是您的第二个 - 虽然它们本质上是相同的我想强调这是对您的第一个函数的重写)

也就是说,你传递的是匿名函数:

(resolve) => {
  return setTimeout(resolve, ms)
}

Promise。但是,箭头函数的语法允许一些快捷方式。

第一个捷径是,如果函数只有一个语句,则可以省略 {}。也就是说上面的函数在shorthand中可以写成:

(resolve) => setTimeout(resolve,ms);

所以

(resolve) => {
  return setTimeout(resolve, ms)
}

(resolve) => setTimeout(resolve,ms);

是完全一样的功能但是第二个版本写在shorthand.

另一个快捷方式是,如果一个函数只接受一个参数,您可以删除参数周围的 ()。所以上面的函数可以重写为:

resolve => setTimeout(resolve,ms);

注意这与:

完全相同
(resolve) => {
  return setTimeout(resolve, ms)
}

只写在shorthand.


补充回答。

你问了

So if resolve is a function, is it just skipped because its never implemented?

你错了。它并非从未实施过。它是由写 Promise class.

的人实现的

Promise class 的作用如下:

如果你称我为构造函数,那么你需要将一个带有两个参数的函数传递给我。稍后我将使用两个参数调用您的函数,这两个参数都是您可以调用的函数。如果你调用第一个函数,那么我会假设你没问题。如果你调用第二个函数,那么我会假设有一个错误。

仅此而已。这两个参数(通常称为 resolvereject 但你可以给它们起任何名字)由 Promise class 定义,并在 [=17] 时传递给你的函数=] class 调用你的函数。

这是我自己的 Promise class 的示例实现,用于演示发生了什么:

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