【问题标题】:undefined response on async action对异步操作的未定义响应
【发布时间】:2020-07-19 18:49:52
【问题描述】:

我正在尝试使用 React/Redux 从 Electron 应用程序启动 exe 文件。

从我正在做的组件dispatch(launch(titleId, titleName))

问题是我在等待readFolders() async 时得到path undefined

知道我做错了什么,我应该改变我的方法吗?

提前致谢!

launch.js

export const launch = async (titleId, titleName) => {
  const path = await readFolders(titleId);
  console.log('path:', path) //undefined

  execFile(path, (err, data) => {
    if (err) {
      console.log('err', err);
    } else if (data) {
      console.log('data:', data)
    } else {
      console.log('success');
    }
  });

  return {
    type: 'LAUNCH',
  };
};

readFolders.js

import fs from 'fs';
import { homedir } from 'os';

const fsPromises = fs.promises;

const isExeFile = file => file.match(/.*\.exe$/i);

export const readFolders = async titleId => {
  const userDir = homedir();
  const folderPath = `${userDir}/downloads`;
  const fullPath = `${folderPath}/${titleId}`;

  try {
    const contents = await fsPromises.readdir(fullPath);
    contents.forEach(async item => {
      if (isExeFile(item)) {
        console.log('isExeFile');
        return `${fullPath}/${item}`;
      }
      try {
        const nestedFolder = await fsPromises.readdir(`${fullPath}/${item}`);
        nestedFolder.forEach(nestedItem => {
          if (isExeFile(nestedItem)) {
            return `${fullPath}/${item}/${nestedItem}`;
          }
          return null;
        });
      } catch (err) {
        console.log('err:', err);
      }
    });
  } catch (err) {
    console.log('err main:', err);
  }
};

编辑:

我也尝试过这种方式,现在const path = await readFolders(titleId); 返回了正确的结果,但是这种方式 eslint 抱怨 (https://eslint.org/docs/rules/no-async-promise-executor),感觉不是一个好的解决方案。

  return new Promise(async (resolve, reject) => {
    try {
      const contents = await fsPromises.readdir(fullPath);
      contents.forEach(async item => {
        if (isExeFile(item)) {
          console.log(`${fullPath}/${item}`);
          return resolve(`${fullPath}/${item}`);
        }
        try {
          const nestedFolder = await fsPromises.readdir(`${fullPath}/${item}`);
          nestedFolder.forEach(nestedItem => {
            if (isExeFile(nestedItem)) {
              console.log(`${fullPath}/${item}/${nestedItem}`);
              return resolve(`${fullPath}/${item}/${nestedItem}`);
            }
            return null;
          });
        } catch (err) {
          console.log('err:', err);
          reject(err);
        }
      });
    } catch (err) {
      console.log('err main:', err);
      reject(err);
    }
  });

【问题讨论】:

标签: javascript node.js ecmascript-6 async-await es6-promise


【解决方案1】:

最后没有返回。当您在forEach 返回时,它仅从callback anonymous function 返回。 return ${fullPath}/${item}/${nestedItem};

有关更多信息,您可以阅读我的博客: https://medium.com/@deepak_v/weird-part-how-to-break-the-loop-in-javascript-8bba3e658267

更新代码:

export const readFolders = async (titleId) => {
  const userDir = homedir();
  const folderPath = `${userDir}/downloads`;
  const fullPath = `${folderPath}/${titleId}`;
  try {
    const contents = await fsPromises.readdir(fullPath);
    let path = "";
    contents.some(async (item) => {
      if (isExeFile(item)) {
        console.log("isExeFile");
        path = `${fullPath}/${item}`;
        return path;
      }
      try {
        const nestedFolder = await fsPromises.readdir(`${fullPath}/${item}`);
        const found = nestedFolder.some((nestedItem) => {
          if (isExeFile(nestedItem)) {
            path = `${fullPath}/${item}/${nestedItem}`;
            return path;
          }
          return false;
        });
        if (found) return path;
        else return false;
      } catch (err) {}
    });
    return path;
  } catch (err) {
    console.log("err main:", err);
  }
};

【讨论】:

  • 我要回来了,但我发现你的代码不同的是nestedFolder.some
  • 有些就像在查找时打破循环。你实际上是返回路径。我没有测试过代码。但你可以明白这一点。
  • 我刚刚尝试过,readFolders.js 中的逻辑适用于我和你的示例。我认为的问题是我如何发送结果,因为launch.js const path = await readFolders(titleId); 仍然未定义。
  • 我认为这可能与此有关(stackoverflow.com/questions/37576685/…),但我看不出如何:D
  • 我用解决方案更新了第一篇文章,但正如我在评论中提到的那样,它感觉不是一个好方法。
猜你喜欢
  • 2017-05-20
  • 2018-09-15
  • 1970-01-01
  • 2017-10-10
  • 1970-01-01
  • 2023-03-16
  • 2016-12-20
  • 1970-01-01
  • 2018-03-18
相关资源
最近更新 更多