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