最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

无法理解MDN Document中Promise.prototype.then()的注释

运维笔记admin18浏览0评论

无法理解MDN Document中Promise.prototype.then()的注释

无法理解MDN Document中Promise.prototype.then()的注释

我正在学习将我的Node.js代码样式从回调转换为承诺,这似乎是趋势并且在新概念中具有许多优点。为了防止错失重要点并从中获益,我正在阅读document on MDN。我可以理解本页中的示例,但不清楚几乎从一开始就提到的注释:

注意:...如果省略第一个参数或提供非函数,则创建的新Promise将简单地采用Promise的实现状态,然后调用它(如果它已满足)。如果省略第二个参数或提供非函数,则创建的新Promise将简单地采用Promise的拒绝状态,然后调用它(如果它被拒绝)。

如果这是微不足道,请提前抱歉。希望用例子来解释,非常感谢。

回答如下:

其他答案提供了很好的解释,但使用跳过的概念表达它可能更容易。

如果promise满足,则调用then的第一个参数(只要它是一个函数);如果承诺拒绝,则调用then的第二个参数(只要它在那里并且是一个函数)。在其他情况下,.then只是跳过。

纯粹主义者会反对说,.then被“跳过”是不正确的,而真正发生的事情是.then创造了一个新的承诺,它等同于(或承担原始承诺的状态)。这在技术上是正确的,但非正式地说,更容易谈论和思考.then被“跳过”。

例子:

function log(v) { console.log("value", v); }
function err(e) { console.log("error", e); }

Promise.resolve(1).then(null, err).then(log);
                   ^^^^^^^^^^^^^^^ "SKIPPED" (onFulfilled is null)

Promise.reject(1).then(log).catch(err);
                  ^^^^^^^^^        "SKIPPED" (onRejected is not given)

为完整起见,catch的相应行为是:

如果承诺拒绝,则调用catch的参数(只要它是一个函数)。在其他情况下,.catch只是跳过。

Promise.resolve(1).catch(err).then(log);
                   ^^^^^^^^^^      "SKIPPED" (promise did not reject)

如果仔细考虑一下,你会发现这一切都意味着.then(null, handler)在各方面都与.catch(handler)完全相同。所以catch可以被认为是一种方便的例程。

但是,允许但忽略非功能处理程序的重点是什么?他们不应该扔一个TypeError或其他东西吗?实际上,这是一个“功能”,可以使用如下:

promise.then(isWednesday && wednesdayHandler)

如果是星期三,那么这将评估为wednesdayHandler,我们可以做一些特殊的星期三处理。它不是星期三,那么这将评估为false,这显然不是一个函数,所以整个then条款将被“跳过”。

发布评论

评论列表(0)

  1. 暂无评论