неопределенный ответ на асин c действие - PullRequest
0 голосов
/ 07 апреля 2020

Я пытаюсь запустить exe-файл из приложения Electron с React / Redux.

Из компонента, который я делаю dispatch(launch(titleId, titleName))

Проблема в том, что я получаю path undefined когда я жду readFolders() asyn c.

Есть идеи, что я делаю неправильно и что я должен изменить в своем подходе?

Заранее спасибо!

запуск. 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); возвращает правильный результат, но в этом случае эслинт жалуется (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);
    }
  });

1 Ответ

0 голосов
/ 07 апреля 2020

Отсутствует возврат в конце. Когда вы возвращаетесь в forEach, он возвращается только из callback anonymous function. return ${fullPath}/${item}/${nestedItem};

Более подробно вы можете прочитать в моем блоге об этом: https://medium.com/@deepak_v / странная часть-как-сломать-l oop -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);
  }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...