javascript - Promise settimeout 最佳实践中的解析 'function' 是什么?

标签 javascript promise settimeout

在学习 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 类的作用:

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

这就是全部内容了。这两个参数(通常称为 resolvereject 但您可以将它们命名为任何名称)由 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/

相关文章:

javascript - Angularjs 处理没有 $scope 的 promise

JavaScript:setTimeOut 位于另一个 setTimeOut 中(嵌套 setTimeOut)以刺激 API 响应不起作用

javascript - 如何添加时间函数来单击

javascript - mongoDb 中的 API 响应发送问题。

javascript - setTimeout 动态延迟

javascript - 无法读取未定义的属性 'tenantid'

javascript - 使用 Javascript 在鼠标悬停时向各个方向平移背景图像

javascript - 获取sessionStorage并恢复值

javascript - 如何使用 Angular 2 创建新页面?

javascript - 在 Node JS 中等待一个函数完成,然后再触发下一个函数