【问题标题】:what is the resolve 'function' in the promise settimeout best practice?承诺 settimeout 最佳实践中的解析“功能”是什么?
【发布时间】:2021-01-04 07:47:42
【问题描述】:

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

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

What is the JavaScript version of sleep()?

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

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

【问题讨论】:

    标签: javascript promise settimeout


    【解决方案1】:

    它们都是一样的。

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

    函数睡眠(毫秒){ 返回新的承诺((解决)=> { 返回 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 类的作用如下:

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

    仅此而已。这两个参数(通常称为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);
        }
    }
    

    【讨论】:

    • 我明白了。额外的答案是我一直在寻找的。我一定是在阅读文档时错过了它。谢谢
    【解决方案2】:

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

    resolve => …
    (resolve) => …
    

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

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

    const add = (a, b) => a + b;
    
    add(1, 2)
    // returns 3
    

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

    【讨论】:

    • 啊,我明白了,但这仍然不能回答我的问题,为了清楚起见,我将编辑我的问题
    • @Sujio:resolve => setTimeout(resolve, ms) 是一个函数。就像function startSomePromiseWork(resolve) { setTimeout(resolve, ms); } 后跟return new Promise(startSomePromiseWork);
    猜你喜欢
    • 2017-02-20
    • 2017-12-12
    • 2018-10-12
    • 2014-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-02
    相关资源
    最近更新 更多