无法理解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
条款将被“跳过”。
无法理解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
条款将被“跳过”。