针对此函数有看不懂的一些地方,请问大佬可以帮忙解释一下吗?

针对这个函数:

export const runJS = async (
    code: string,
    web = is.main ? activeWindow()?.webContents : electron.webFrame,
): Promise<void> => {
    if (!web) {
        throw new Error('No active window');
    }

    await web.executeJavaScript(code);
};

有几个点看不明白:

  1. 参数:web = is.main ? activeWindow()?.webContents : electron.webFrame, 是一个三段表达式,请问是否调用函数,参数web是:is.main,就变成activeWindow()?.webContents真正传入,传入的不是is.main,就变为electron.webFrame
  2. 返回类型:Promise<void>

是指的返回await func(),都需要使用Promise类型参数是吗?

  1. 返回类型:Promise<void> 这里的<void>作用是什么呢?
    如下有什么区别呢?

    Promise<void> 
    Promise
阅读 1.2k
3 个回答
  1. 参数:web = is.main ? activeWindow()?.webContents : electron.webFrame, 是一个三段表达式,请问是否调用函数,参数web是:is.main,就变成activeWindow()?.webContents真正传入,传入的不是is.main,就变为electron.webFrame?

这个理解基本上是正确的。不过描述“传入是/否 is.main”不正确。

(1) ? (2) : (3) 是一个三元运算符表达式,这个表达式根据 (1) 的真假判断来决定使用 (2) 还是 (3) 的值。所以是根据 is.main 的布尔判定来决定,而不是根据是否传入来决定。何况,代码中也没找到用于“传入”is.main 的形参。

web = is.main
    ? activeWindow()?.webContents   // 如果 is.main 判定为 truthy,取此值
    : electron.webFrame             // 如果 is.main 判定为 falsy,取此值

参考:Falsy | MDN

  1. 返回类型:Promise<void>
    是指的返回await func(),都需要使用Promise类型参数是吗?
  2. 返回类型:Promise<void> 这里的<void>作用是什么呢?
    如下有什么区别呢?

返回类型 Promise<void> 是指对普通无返回类型函数的 Promsie 封装。由于 Promise 通常就是指返回值类型,所以一般不会这么用。对于不关心 Promise 值类型的情况,会使用 Promise<unknown>,对于最大兼容 Promise 值的情况,会使用 Promise<any>

对于一个 async 函数来说,必须返回 Promise<T> 类型。async 函数内部只需要返回一个简单类型(非 Promise 类型)即可,它会自动封装。对于一个 Promise 类型的值,可以通过 await 来等待它的值,对于一个普通类型的值,直接返回也是可以(一会儿看下面的示例代码)。

关于这部分,可以参阅:理解 JavaScript 的 async/await - 边城客栈 - SegmentFault 思否

如果要说内部返回值 await 后面的函数,可以是返回类型 void 或者 Promise<void> 的。或者如果允许 any 的话(根据 TS 配置),也可以是 any 或者 Promise<any> 的。比如

async function getPromise(isBla: boolean): Promise<void> {
  return isBla ? test1() : await test2()
  // 注:上面这句,两个函数的调用前加不加 await 都不影响逻辑结果
}

function test1(): void { }

async function test2(): Promise<void> { }

但是如果函数有返回值,那就会出错,比如

snipaste_20241124_101847.png

1.参数web这块的赋值,指的是默认参数。如果外部调用runJS时候,没有传第二个参数,第二个参数默认就是这个三目运算的返回值,其中的is并不是外部传入的,应该是个全局变量。
2.返回类型Promise<void>是因为这个函数是async函数,返回值总会用Promise包裹。
3.Promise<T>中,T表示包裹的数据的类型。如果这里函数返回1,应该是Promise<number>,返回"abc",应该是应该是Promise<string>。这里实际函数没有返回值,所以是viod。

  1. 三目运算符,根据is.main的取值决定赋值给web的值

    1. 为true或隐式类型转换为true时返回activeWindow()?.webContents,这里activeWindow()如果返回了包含webContents属性的对象则取其值,如果返回了不包含webContents属性的对象(一般考虑undefined或null)则直接取activeWindow()本身。
    2. 为false或隐式类型转换为false时返回electron.webFrame,需要注意没有使用可选链运算符?会在electron没有webFrame属性时抛出error。
  2. async函数如果要声明返回类型必须是Promise对象,这是固定语法规则;<>是泛型参数标识,里面用void表示Promise对象包装的async函数返回结果不能有返回值,即不能return值,跟await没有关系。
  3. 返回类型的Promise必须传泛型参数的,建议先确认一下。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏