异步和同步功能节点JS

时间:2020-04-27 19:20:09

标签: javascript node.js asynchronous extract synchronous

我正在运行一些功能,可以从Nexus下载zip文件,然后解压缩/提取该zip文件的内容,最后搜索特定的文件类型。所有功能都起作用,但是由于某种原因,同步搜索不会产生任何结果。如果仅在1个脚本中运行下载和提取功能,然后在另一个脚本中执行搜索,我将得到预期的结果。我几乎肯定是由于搜索是同步的,而下载和提取都是异步的。在下载和提取功能运行之后,是否有一种快速添加结尾功能的快速方法?下面是代码:

    //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函数合并到现有的download&extract函数中的任何帮助,都表示赞赏...

0 个答案:

没有答案