javascript - 子任务完成后让 grunt 运行任务

标签 javascript protractor gruntjs

问题
我有一个繁重的任务来启动自动化测试。逻辑如下:
清洁.tmp文件夹 -> 找到所需的 .xlx 格式的数据文件 -> 在 .tmp 下将文件转换为 JSON 格式文件夹 -> 开始对转换后的文件进行测试
它工作正常,直到数据文件变得非常大,并且在转换文件的子任务完成之前开始测试
问题
如何让 grunt 等到子任务完成,不多/不少?
到目前为止我尝试过的
我尝试了几种制作convert-data-sheet的方法任务异步没有任何运气。
1. 显然我尝试过的第一件事就是这个

// register task for converting data sheet
grunt.registerTask('convert-data-sheet', 'task for converting xslx file into json', function(product, tenant, environment, codeBase) {
    
   let done = this.async();
   /*
    Some code here, not essential to the question
    */
    // run conversion for each sheet
    for (let i = 0; i < sheetTabs.length; i++) {
        dst = path.resolve(__dirname, './protractor/.tmp_files/test_data', `${sheetTabs[i]}.json`);
        options.sheet = (i + 1).toString();
        convertExcel(src, dst, options);
    }
    done();
});

// register a task for ui tests
grunt.registerTask('e2e', 'task for protractor tests', function() {
    let done = this.async();
    grunt.initConfig({
        /**
         * Long and boring initConfig object
         */
    });

    // clean .tmp directory
    grunt.task.run('clean:tmpFiles');

    // generate data json files and other files
    grunt.task.run([`convert-data-sheet:${parameters.product}:${parameters.tenant}:${parameters.environment}:${parameters.codeBase}`, 'bake:protractorConfigs']);

    grunt.task.run('protractor:configFile');
    done();
});

它仍然尝试在创建数据文件之前运行 Protractor
2. 这是我当前的代码,它只挂起指定的时间段
// register task for converting data sheet
grunt.registerTask('convert-data-sheet', 'task for converting xslx file into json', function(product, tenant, environment, codeBase) {
    /*
    Some code here, not essential to the question
    */
    // run conversion for each sheet
    for (let i = 0; i < sheetTabs.length; i++) {
        dst = path.resolve(__dirname, './protractor/.tmp_files/test_data', `${sheetTabs[i]}.json`);
        options.sheet = (i + 1).toString();
        convertExcel(src, dst, options);
    }
});

// register a task for ui tests
grunt.registerTask('e2e', 'task for protractor tests', function() {

    let done = this.async();

    grunt.initConfig({
        /**
         * Long and boring initConfig object
         */
    });

    // clean .tmp directory
    grunt.task.run('clean:tmpFiles');

    // generate data json files and other files
    grunt.task.run([`convert-data-sheet:${parameters.product}:${parameters.tenant}:${parameters.environment}:${parameters.codeBase}`, 'bake:protractorConfigs']);

    // run protractor with a delay 2000ms to let previous tasks finish
    setTimeout(function() {
        grunt.task.run('protractor:configFile');
        done();
    }, 2000);
});

但事实证明,即使是当前的代码也没有达到预期的效果。即使在数据转换开始之前,它也只是挂起 2 秒没有做任何事情。所以从日志中我看到 - grunt 开始 -> 挂起 2000 -> 转换 -> 运行 Protractor

最佳答案

解决方案

// register task for converting data sheet
grunt.registerTask('convert-data-sheet', 'task for converting xslx file into json', function(product, tenant, environment, codeBase) {

   let done = this.async();
   /*
    Some code here, not essential to the question
    */
    mkdirp(path.resolve(__dirname, './protractor/.tmp_files/test_data'), function(err) {

        // run conversion for each sheet
        for (let i = 0; i < sheetTabs.length; i++) {
            dst = path.resolve(__dirname, './protractor/.tmp_files/test_data', `${sheetTabs[i]}.json`);
            options.sheet = (i + 1).toString();
            convertExcel(src, dst, options,
                (err, data) => {
                    if (i === (sheetTabs.length - 1)) {
                        done();
                    }
                }
            );
        }
    });
});

// register a task for ui tests
grunt.registerTask('e2e', 'task for protractor tests', function() {

    grunt.initConfig({
        /**
         * Long and boring initConfig object
         */
    });

    // clean .tmp directory
    grunt.task.run('clean:tmpFiles');

    // generate data json files and other files
    grunt.task.run([`convert-data-sheet:${parameters.product}:${parameters.tenant}:${parameters.environment}:${parameters.codeBase}`, 'bake:protractorConfigs']);

    grunt.task.run('protractor:configFile');

});
这种方法有什么特别之处
我不完全了解同步执行任务的情况。
众所周知,这种情况
console.log(1)
setTimeout(function(){console.log(2)}, 1000)
console.log(3)
结果是
1
3
2
因为 JS 只是调度 setTimeout等待1000女士,它继续执行脚本
就我而言,您可以想到 convertExcel截至setTimeout .于是JS预定转换然后立即调用done() ,所以 Grunt 没有等到这个过程真正完成。
幸运的是,excel-as-json模块具有传递我所做的回调函数的选项。所以我需要做的就是调用done()当最后一张表的选项卡的转换实际完成时。
修复后我遇到的唯一问题是这个错误 Fatal error: ENOENT: no such file or directory, mkdir ...只需带来 mkdir 即可解决入戏
重要的
这仍然不理想,因为如果我的 excel 文件中有 10 张,第五张是最大的,但我只等待最后一张,它就行不通了。但只要我知道如何解决它,我会在需要时这样做

关于javascript - 子任务完成后让 grunt 运行任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58699859/

相关文章:

javascript - 谷歌地图如何在不重新加载且不使用历史 API 的情况下更改其 URL?

javascript - 从 Controller 向 Angular 工厂传递参数

javascript - Vue.js 过渡问题

node.js - 指南针 :server not found when running `grunt server`

javascript - 在 iFrame 中显示用户上一页

javascript - 等待一个或另一个 Promise

angularjs - 使用带有 Protractor 的 Angular Material 进行 E2E 测试是否有任何问题?

javascript - Protractor TAB 键已停止改变焦点,现在正在添加空格

arguments - grunt,grunt-shell和命令参数

javascript - Grunt Globbing 模式