来自phantomJS的POST调用不会使服务器从咕噜声中运行
这是我的设置。
- 我有一个咕task任务,做2件事情:1)启动一个HTTP服务器监听某个端口2)触发另一个咕task任务
- 上面触发的grunt任务是在PhantomJS的
test-index.html
页面上运行testing的testem任务。 -
test-index.html
页面在第一个grunt任务中启动服务器的端口上发送一个POST调用。
问题:POST调用不会打到我的服务器。
注意:如果我手动运行同一个服务器(不是从grunt)然后运行testinggrunt任务,POST调用命中服务器。
这里是代码:
咕task任务
grunt.registerMultiTask('coverage', 'Generates coverage reports for JS using Istanbul', function () { var server = http.createServer(function(req, resp) { resp.setHeader("Access-Control-Allow-Origin", "*"); console.log('Got something'); req.pipe(fs.createWriteStream('coverage.json')) resp.end(); }); var port = 7358; server.listen(port); // This task simply executes a command: `testem.js ci` grunt.task.run('testem').then(function() { server.close(); }); });
test-index.html(在某处)
function onTestemLoad() { Testem.on('all-test-results', function(results){ var xhr = new XMLHttpRequest(); xhr.open('POST', 'http://localhost:7358/'); xhr.send(JSON.stringify(window.__coverage__)) }); }
任何人都可以指出什么可能会出错吗?
你被grunt.task.run
误导了! 这行不会运行任务,它只是把它放在当前任务完成后运行的任务列表的顶部( http://gruntjs.com/api/grunt.task#grunt.task.run )。
第二个问题是,当一个任务完成时,它将其所有正在运行的进程closures。
那么会发生什么呢?
-
coverage
开始,在您的服务器上旋转,然后将testem
注册为下一个任务 -
coverage
结束,取下你的服务器 - 下一个任务(=
testem
)运行,但没有服务器在这里回答…
你可以通过做以下两件事来解决它:
- 内联你的testing:用一个直接调用testemreplace
grunt.task.run('testem')
- 确保你的testing同步运行 – 或者保持你的任务活着,直到你的testing完成(使用
this.async
– 见http://gruntjs.com/api/inside-tasks#this.async )。