【问题标题】:Difference between two ways of resolving a promise解决承诺的两种方式之间的区别
【发布时间】:2021-11-07 02:57:31
【问题描述】:

我想了解两个代码 sn-ps 之间的区别,它们都以不同的方式解析承诺,但收到相同的结果(在一秒钟后解析)。

哪种方法是正确的?

function longTask(){
    return new Promise((resolve, reject) =>
    setTimeout(() => resolve(), 1000)
)}

longTask().then(() => console.log("done"));

function longTask(){
    return new Promise((resolve, reject) =>
    setTimeout(resolve, 1000)
)}

longTask().then(() => console.log("done"));

【问题讨论】:

  • 这种情况没有区别。
  • 它们的工作方式相同。唯一的区别与承诺完全无关。在一种情况下,您只需传递对resolve 的函数引用,另一种情况是调用resolve 的匿名函数。承诺与此无关。
  • 对于这种情况,唯一的区别是可以跳过一个额外的匿名函数。

标签: javascript promise settimeout arrow-functions


【解决方案1】:

两者在技术上是相同的。

第一个解决方案运行一个匿名函数,该函数调用resolve

第二个解决方案获得对resolve 函数的引用,该函数最终也会被调用。

【讨论】:

    【解决方案2】:

    在这种情况下,如果您不使用值进行解析,则没有区别。在需要使用值来解析承诺的情况下,您可能希望使用第一个示例,以便控制传递给 resolve 函数的内容。

    function longTask(){
        return new Promise((resolve, reject) =>
        setTimeout(() => resolve(someResolvedValue), 1000)
    )}
    
    longTask().then(() => console.log("done"));

    编辑:或者您可以使用第二个示例并将解析的值作为第三个参数传递给 setTimeout。感谢 VLAZ 指出这一点。

    function longTask(){
        return new Promise((resolve, reject) =>
        setTimeout(resolve, 1000, someResolvedValue)
    )}
    
    longTask().then(() => console.log("done"));

    【讨论】:

    • "在你需要用一个值来解析 promise 的情况下,你会想要使用第一个例子" 为什么? *.com/a/7503942
    • 这也很公平。我没有意识到这一点。