首页 > 解决方案 > `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 规则,并在第一种情况下建议重构?

标签: javascriptnode.jstypescriptasynchronousasync-await

解决方案


推荐阅读