【问题标题】:Are promises lazily evaluated?承诺是否被懒惰地评估?
【发布时间】:2016-05-12 15:51:21
【问题描述】:

下面的代码是否保证输出HERE

var p = new Promise(() => console.log("HERE"))

(也就是说,如果从未调用p.then(…) 来处理结果,var p = new Promise(fn) 是否总是执行fn?)

更具体地说,在 Service Worker 的上下文中,如果我调用 Cache.delete() 但从未在返回值上调用 .then()(或者我丢弃返回值),是否保证缓存条目被删除?

【问题讨论】:

    标签: javascript promise lazy-evaluation service-worker


    【解决方案1】:

    是的,这是有保证的。 specification of Promise 有这一步,将始终被评估:

    1. 让完成为 Call(executor, undefined, «resolvingFunctions.[[Resolve]], resolveFunctions.[[Reject]]»)。

    其中executor 是您传递给Promise 构造函数的内容,Call 导致该代码正在运行。这一切都发生在 Promise 甚至返回到您的 p 变量之前。

    【讨论】:

    • 或者简单地说:传递给Promise构造函数的执行函数() => console.log("HERE")总是立即执行。
    • @LUH3417 是的,但是 OP 想知道它是否得到保证,因此规范的引用和引用显示了它的调用位置和方式,因此 为什么这是有保证的。
    • 无意冒犯,只针对不熟悉“规范演讲”的用户
    【解决方案2】:

    正如詹姆斯所说,保证会调用该函数。虽然这并不能保证缓存条目被删除!

    您必须检查承诺解析的值(true 如果缓存条目被删除,false 否则)。

    【讨论】:

    • 啊,好点,那是……不幸!我想我可以忍受缓存条目并不总是被删除,尽管我不确定如何处理它可能经常发生的可能性。
    猜你喜欢
    • 2017-01-13
    • 2014-10-10
    • 1970-01-01
    • 2017-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-07
    • 1970-01-01
    相关资源
    最近更新 更多