javascript - `return await ...` 的替代方案,用于等待某些必须返回的结果的情况
问题描述
我知道 ESLint/TSLint 规则不能在 100% 的情况下“正确”。但是我需要决定哪些规则我真的不需要。
在 ElectonJS 中,不建议在 Renderer Process 中使用 Node.js 模块。相反,渲染器进程应该向主进程发送请求并监听响应。下面的 TypeScript 类负责这个例程。(我希望我的变量名使代码不需要注释,但是那些很难理解,请在注释中告诉我)
import { ipcRenderer as IpcRenderer } from "electron";
import InterProcessDataTransferProtocol from "@ProjectInitializer:Root/InterProcessDataTransferProtocol";
import CheckingPathForWriteAccess = InterProcessDataTransferProtocol.CheckingPathForWriteAccess;
import MainProcessEvents = InterProcessDataTransferProtocol.MainProcessEvents;
import Timeout = NodeJS.Timeout;
export default abstract class InterProcessFacilitator {
private static readonly IS_PATH_WRITABLE__RESPONSE_WAITING_PERIOD__MILLISECONDS: number = 10000;
public static async requestCheckingPathForAccessToWrite(targetPath: string): Promise<boolean> {
IpcRenderer.send(
InterProcessDataTransferProtocol.RendererProcessEvents.checkingPathForWriteAccessRequestSent,
{ targetPath }
);
const responseWaitingTimeout: Timeout = setTimeout(
() => { throw new Error("No response from Main Process"); },
InterProcessFacilitator.IS_PATH_WRITABLE__RESPONSE_WAITING_PERIOD__MILLISECONDS
);
return await new Promise<boolean>((resolve: (isWritable: boolean) => void): void => {
IpcRenderer.on(
MainProcessEvents.checkingPathForWriteAccessDone,
(_event: Electron.Event, responsePayload: CheckingPathForWriteAccess.ResponsePayload) =>
{
clearTimeout(responseWaitingTimeout);
if (responsePayload.targetPath === targetPath) {
resolve(responsePayload.isWritable);
}
});
});
}
}
目前,方法requestCheckingPathForAccessToWrite
违反了 ESLint 规则no-return-await。但是它可以用作:
async function checkTheDefaultPathForWrightPermission(): Promise<void> {
try {
const pickedPathIsWritable: boolean = await InterProcessFacilitator
.requestCheckingPathForAccessToWrite(DEFAULT_PATH);
pickedPathIsWritable ?
this.relatedStoreModule.reportAboutUnableToWriteToDirectoryErrorResolution() :
this.relatedStoreModule.reportAboutUnableToWriteToDirectoryErrorOccurrence();
} catch (error) {
console.error(`unable to check wright permission for path ${DEFAULT_PATH}`);
console.error(error);
}
}
来自 ESLint 文档:
在异步函数内部,return await 很少有用。由于异步函数的返回值总是包装在 Promise.resolve 中,因此 return await 实际上并没有做任何事情,除了在总体 Promise 解决或拒绝之前增加额外的时间。唯一有效的例外是,如果在 try/catch 语句中使用 return await 来捕获另一个基于 Promise 的函数的错误。
您能否批评我的解决方案或此 ESLint 规则,并在第一种情况下建议重构?