【问题标题】:async.series doesn't execute the second functionasync.series 不执行第二个函数
【发布时间】:2021-11-04 02:48:18
【问题描述】:

我正在尝试使用 async.series 以顺序模式在不同文件中执行 2 个函数。 用例是将日志文件下载到本地,然后移动到文件夹中。

这些功能单独工作正常。 现在我的下一步是在 index.js 中要求这两个文件,并依次调用这两个函数。

这是将文件从 webdav 写入本地机器的代码:

const fs = require('fs');
const stream = require('stream');
const util = require('util');
const pipeline = util.promisify(stream.pipeline);
const { createClient } = require("webdav");
const path = require("path");
const client = createClient(
    "https:/*/webdav/Sites/Logs", {
        username: "*",
        password: "*"
    }
);
async function writeFiles(){
    console.log('inside write functions');
    let directoryData = await client.getDirectoryContents("/");
        console.log('after directorydata' +directoryData);
    await Promise.all(directoryData.map(start));
      
}
async function start(dir) {
    let  fileName = dir.filename;
    console.log('inside start function');
    var directory = path.join(__dirname,'/logs/') 
    if(fileName.includes('.log')){

        try {
            let fileName = dir.filename;
            //console.log(fileName);
            await pipeline(
            client.createReadStream(fileName),
            fs.createWriteStream(directory + fileName)
            );
            return directory;
            console.log('done');
        } catch (e) {
            console.log(e);
        }
        
} 
}
module.exports = writeFiles;

这是创建文件夹并根据名称将日志文件移动到其中的代码:

const testFolder = './logs/';
const fs = require('fs');
const path = require("path");
var directory = path.join(__dirname,'/logs/');
async function sort (){
    console.log('inside sort function sorting file');
    await fs.readdir(directory, (err, files) => {
        //console.log('sdcfe');
        if(files){
            console.log('filesss')
        } else {
            console.log('no filesss')
        }
    files.forEach(file => {
    let fileFolder = file.split('-')[0];
    var folder = fileFolder.replace('.', "");
    var dir = directory+folder;
    if (!fs.existsSync(dir)){
        //console.log('inside if' + dir);
        fs.mkdirSync(dir);
    } 
    const currentPath = path.join(directory, file);
    const destinationPath = path.join(directory, folder, file);
    fs.rename(currentPath, destinationPath, function (err) {
        if (err) {
            throw err
        } else {
            return destinationPath;
               console.log("Successfully moved the file!");
        }
    });
});
});

}
module.exports = sort;

这是 index.js 文件,需要上述两个文件并按顺序调用它们(一旦写入功能完成,我需要将日志文件移动到文件夹中)

'use strict';

// Initialize constants
const async = require('async');


const writeFiles = require('./webdavConnect2');
const sort = require('./sortingFiles');


// Initialize the program
let program = require('commander');

// Initialize the version
program.version('0.5.0');


program
    .command('say')
    .description('Batch command that can be used to zip, upload, import, and re-index for a given site import.')
    .action(function () {
        function webdavConnect() {
            console.log('inside webdav function');
             // write the files into local machine
            writeFiles();
         }

         // move the files into folders
         function sortingFiles() {
            console.log('inside sort function');
            
            sort();
             
         }
        
        async.series([
            function(callback) {
            webdavConnect(function(directory){
           callback(null, directory);
       })
       },
       function(callback) { sortingFiles(function(destinationPath){
           callback(null,destinationPath);
       })
       }
            

            ], function(asyncErrorObj) {

            // Was an error defined?  If so, then throw it
            if (asyncErrorObj !== null) { throw asyncErrorObj; }

            
            
            console.log('END');

        });

    });


// Parse the command-line arguments
program.parse();

问题在于当前执行的是第一个函数而不是第二个函数。

【问题讨论】:

    标签: javascript node.js async-await node-modules async.js


    【解决方案1】:

    发布朋友建议的解决方案:

    我指出了有关 async.series 使用的一些问题。尝试用以下代码替换您的 index.js。请注意现在传递给 async.series 的异步函数,并注意这些函数现在如何接受 Async.js 应该传递给它们的回调,而当前代码中缺少这些回调。我无法对此进行测试,因为该项目不可重现(至少在没有重大准备的情况下)。如果有任何问题,您可以分享另一条消息和/或直接标记我!希望对您有所帮助。

    "use strict";
    
    const async = require("async");
    const writeFiles = require("./webdavConnect2");
    const sort = require("./sortingFiles");
    let program = require("commander");
    
    program.version("0.5.0");
    
    program
      .command("say")
      .description(
        "Batch command that can be used to zip, upload, import, and re-index for a given site import."
      )
      .action(function () {
        async function webdavConnect(callback) {
          callback(await writeFiles());
        }
    
        async function sortingFiles(callback) {
          callback(await sort());
        }
    
        async.series(
          [
            function (callback) {
              webdavConnect(function (directory) {
                callback(null, directory);
              });
            },
            function (callback) {
              sortingFiles(function (destinationPath) {
                callback(null, destinationPath);
              });
            }
          ],
          function (asyncErrorObj, results) {
            if (asyncErrorObj !== null) {
              throw asyncErrorObj;
            }
            console.log(results);
          }
        );
      });
    
    program.parse();
    

    【讨论】:

      【解决方案2】:

      似乎这两个函数都是异步的,它们应该在带有等待的异步函数中调用。第一个函数没有完成执行,第二个函数开始执行,但是因为它没有找到文件,所以你看不到第二个函数的输出。这就是我要解决执行问题的方法:

      "use strict";
      
      const writeFiles = require("./webdavConnect2");
      const sort = require("./sortingFiles");
      
      // Initialize the program
      let program = require("commander");
      
      // Initialize the version
      program.version("0.5.0");
      
      program
        .command("say")
        .description(
          "Batch command that can be used to zip, upload, import, and re-index for a given site import."
        )
        .action(async function() {
          await writeFiles();
          await sort();
        });
      
      // Parse the command-line arguments
      program.parse();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-07-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多