针对这个函数:
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);
};
有几个点看不明白:
- 参数:
web = is.main ? activeWindow()?.webContents : electron.webFrame,
是一个三段表达式,请问是否调用函数,参数web是:is.main
,就变成activeWindow()?.webContents
真正传入,传入的不是is.main
,就变为electron.webFrame
? - 返回类型:
Promise<void>
是指的返回await func()
,都需要使用Promise
类型参数是吗?
返回类型:
Promise<void>
这里的<void>
作用是什么呢?
如下有什么区别呢?Promise<void> Promise
这个理解基本上是正确的。不过描述“传入是/否
is.main
”不正确。(1) ? (2) : (3)
是一个三元运算符表达式,这个表达式根据(1)
的真假判断来决定使用(2)
还是(3)
的值。所以是根据is.main
的布尔判定来决定,而不是根据是否传入来决定。何况,代码中也没找到用于“传入”is.main
的形参。参考:Falsy | MDN
返回类型
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>
的。比如但是如果函数有返回值,那就会出错,比如