const toBool = [() => true, () => false]
上面的行在这个 MDN 指南中用于(看似)将 Node 的
fs.promises.access
方法的输出评估为布尔值。
相关代码片段如下,摘自 MDN 示例:
const toBool = [() => true, () => false];
const prepareFile = async (url) => {
...
const exists = await fs.promises.access(filePath).then(...toBool);
...
};
代码按预期工作;我希望得到关于编译器如何评估这些行的解释,因为我无法完全理解它。
据我所知,当
fs.promises.access
返回 undefined
时(根据访问方法的 Node 文档,成功解决),exists
设置为 true
,而返回 Error
对象将 exists
设置为 false。
有人可以解释一下上面代码片段中的
true
是如何计算这条线的吗?exists
方法返回一个 Promise,当可访问性检查成功时,该 Promise 会解析;当可访问性检查失败时,该 Promise 会被拒绝。
access()
方法返回第二个promise。它可以接受两个参数:第一个是当第一个 Promise
resolves时执行的回调,第二个是当第一个 Promise rejects 时执行的回调。 第二个 Promise 如何解析取决于相关回调返回(或抛出)的内容。
现在看您的具体代码。请注意
then
如何使用
扩展语法为
then(...toBool)
调用提供两个参数。归根结底是这样做:then
如果第一个 Promise 解析(即可访问性检查成功),则执行第一个函数,忽略参数,并使第二个 Promise 满足值
then(() => true, () => false);
。另一方面,如果第一个承诺拒绝(即可访问性检查不成功),则这些回调的
第二个将执行,忽略(错误)参数,并使第二个承诺履行值
true
。false
运算符确保当第二个承诺履行时,将该值(
await
或false
)分配给true
。我希望这能澄清这一点。