Asyn c и Syn c Функции Node JS - PullRequest
       74

Asyn c и Syn c Функции Node JS

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

У меня есть пара функций, которые я запускаю, чтобы загрузить zip-файл из Nexus, затем распаковать / распаковать содержимое zip-файла, и, наконец, выполнить поиск определенного c типа файла. Все функции работают, однако синхронный поиск по какой-то причине не дает никаких результатов. Если я просто запускаю функции загрузки и извлечения в 1 сценарии, а затем выполняю поиск в другом сценарии, я получаю ожидаемые результаты. Я почти уверен, что это происходит из-за синхронного поиска, в то время как загрузка и извлечение являются асин c. Есть ли быстрый способ добавить функцию поиска в конце после запуска функций загрузки и извлечения? Ниже приведен код:

    //npm modules
    const fs = require('fs-extra');
    const download = require('download');
    const unzipper = require('unzipper');
    const path = require('path');

    //Custom Variables
    const artifact = 'SOME_FILE.zip';
    const repo = "SOME NEXUS REPOSITORY";
    const url = "http://SOME URL/repository/";
    const directory = 'SOME DIRECTORY';

//Get Artifact and Extract it to local directory function
  const getArtifact = async () => {
    const getArtifact = await download(url+repo, "./unzip")
    const file = await fs.writeFileSync(directory+artifact, await download(url+repo))
     const readStream = await fs.createReadStream(directory + artifact).pipe(unzipper.Extract({path: 
directory}))
}

//Find function which should run after download and extract have been fulfilled

const findFile = function (dir, pattern) {
var results = [];
fs.readdirSync(dir).forEach(function (dirInner) {
    dirInner = path.resolve(dir, dirInner);
    var stat = fs.statSync(dirInner);
    console.log(stat)
    if (stat.isDirectory()) {
        results = results.concat(findFile(dirInner, pattern));
    }
    if (stat.isFile() && dirInner.endsWith(pattern)) {
        results.push(dirInner);
    }
});
console.log(results)
return results;
};


//clear contents of directory before new download and extract
fs.emptyDirSync(directory)

//call download and extract function
getArtifact()

Когда я запускаю "findFile" после загрузки и извлечения в отдельном скрипте, я получаю ожидаемый вывод массива. Однако, когда я пытаюсь включить (см. Ниже) это в тот же скрипт, я получаю пустой массив:

    getArtifact().then(function findFile (dir, pattern) {
    var results = [];
    fs.readdirSync(directory).forEach(function (dirInner) {
        dirInner = path.resolve(directory, dirInner);
        var stat = fs.statSync(dirInner);
        console.log(stat)
        if (stat.isDirectory()) {
            results = results.concat(findFile(dirInner, pattern))
            if (stat.isFile() && dirInner.endsWith(pattern)) {
                results.push(dirInner);
            }
        }
        console.log(results)
        return results;
        })
    })

    //Output

    []



    //If I try the following:
    getArtifact().then(findFile(directory, file))
    // I get same empty array
    []

    //If I run "findFile" in its own script after the download extract I get the following:
    [
    'SOME_FILE_PATH\\document1',
    'SOME_FILE_PATH\\document2',
    'SOME_FILE_PATH\\document3',
    'SOME_FILE_PATH\\document4',
    'SOME_FILE_PATH\\document5',
    'SOME_FILE_PATH\\document6',
    'SOME_FILE_PATH\\document7
    ]

Любая помощь в том, как я могу включить мою функцию findFile в мою существующую функцию загрузки и извлечения, приветствуется ...

...