Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 运行序列同步任务从未完成_Node.js_Typescript_Gulp_Run Sequence - Fatal编程技术网

Node.js 运行序列同步任务从未完成

Node.js 运行序列同步任务从未完成,node.js,typescript,gulp,run-sequence,Node.js,Typescript,Gulp,Run Sequence,我几乎可以肯定这是错误的,所以首先我要提出我的高层次要求 我正在使用,希望通过使用Xvfb在无头模式下运行量角器测试。我不希望Xvfb服务器一直运行(这是一个构建服务器),因此我希望启动一个Xvfb服务,让量角器完成它的工作,然后“优雅地”关闭Xvfb。孤立地说,这些任务工作得很好,但是在将它们添加到gulpbuild设置中时,我遇到了麻烦 下面是gulpfile中的任务: gulp.task('e2e.headless', (done: any) => runSequence('st

我几乎可以肯定这是错误的,所以首先我要提出我的高层次要求

我正在使用,希望通过使用Xvfb在无头模式下运行量角器测试。我不希望Xvfb服务器一直运行(这是一个构建服务器),因此我希望启动一个Xvfb服务,让量角器完成它的工作,然后“优雅地”关闭Xvfb。孤立地说,这些任务工作得很好,但是在将它们添加到gulpbuild设置中时,我遇到了麻烦

下面是gulpfile中的任务:

gulp.task('e2e.headless', (done: any) =>
  runSequence('start.xvfb',
              'protractor',
              'stop.xvfb',
              done));
任务本身通过单独的typescript任务文件加载,即:

import {runProtractor} from '../../utils';

export = runProtractor
下面是我的(最新)实用程序文件本身

量角器.ts

xvfb_tools.ts

我觉得我可能正在四处奔走,从我的
exec
child\u过程中创建一个承诺,但是早期的代码交互没有做到这一点,所以。。。 请注意,应该在显示根目录的
runpregrator()
中输出的调试日志记录从未被调用,因此我很确定这里存在异步问题。以下是任务的输出:

[00:47:49] Starting 'e2e.headless'...
[00:47:49] Starting 'start.xvfb'...
[00:47:49] Finished 'start.xvfb' after 12 ms
[00:47:49] Starting 'protractor'...
[00:47:49] Finished 'protractor' after 5.74 ms
[00:47:49] Starting 'stop.xvfb'...
[00:47:49] Finished 'stop.xvfb' after 11 ms
[00:47:49] Finished 'e2e.headless' after 38 ms
[00:47:49] Xvfb terminated

有人能帮我纠正错误吗?

您需要在gulp任务中添加回调函数,并在所有runSequence任务完成后调用cb(回调)函数

gulp.task('e2e.headless', (cb) =>
runSequence('start.xvfb',
    'protractor',
    'stop.xvfb',
     (err) => {
        if (err) {
            console.log(err.message);
        } else {
            console.log("Build finished successfully");
        }
        cb(err);
    });
});

感谢安格拉尔2号种子队的卢多维奇

错误在于没有从包装器类调用rundragrator函数,即

export=runpregrator()
。一旦注意到这一点,我就可以去掉不必要的包装器函数以及promiseFromChildProcess,它们都会分散注意力

最后一个任务只是一个匿名函数,它接受退出时调用的gulp回调“done”:

function reportError(message: string) {
  console.error(require('chalk').white.bgRed.bold(message));
  process.exit(1);
}

export = (done: any) => {
    const root = normalize(join(__dirname, '..', '..', '..'));
    const exec = require('child_process').exec;

    process.env.DISPLAY=':99';
    util.log('cwd:', root);

    exec('protractor', { cwd: root, env: process.env},
      function (error: Error, stdout: NodeBuffer, stderr: NodeBuffer) {
        if (error !== null) {
          reportError('Protractor error: ' + error + stderr);
        } else {
          done();
        }
      });
}
gulp.task('e2e.headless', (cb) =>
runSequence('start.xvfb',
    'protractor',
    'stop.xvfb',
     (err) => {
        if (err) {
            console.log(err.message);
        } else {
            console.log("Build finished successfully");
        }
        cb(err);
    });
});
function reportError(message: string) {
  console.error(require('chalk').white.bgRed.bold(message));
  process.exit(1);
}

export = (done: any) => {
    const root = normalize(join(__dirname, '..', '..', '..'));
    const exec = require('child_process').exec;

    process.env.DISPLAY=':99';
    util.log('cwd:', root);

    exec('protractor', { cwd: root, env: process.env},
      function (error: Error, stdout: NodeBuffer, stderr: NodeBuffer) {
        if (error !== null) {
          reportError('Protractor error: ' + error + stderr);
        } else {
          done();
        }
      });
}