javascript - 为什么将 `done` 函数传递给 Karma 的服务器时会出现 gulp 错误?

标签 javascript node.js gulp karma-runner

只是写了一个(到目前为止)非常简单的 gulpfile,我对遇到的错误感到困惑。

当这个任务的测试失败时,gulp 优雅地退出

gulp.task('test', done => {
    new KarmaServer({
        configFile: __dirname + '/karma.conf.js',
        singleRun: true
    }, () => done()).start();
});

...产生:

Chrome 50.0.2661 (Mac OS X 10.11.3): Executed 11 of 11 (3 FAILED) (0.053 secs / 0.023 secs)
[17:38:02] Finished 'test' after 2.43 s

但是当你精简它只是将 done 传递给 Karma 时,它会相当不优雅地失败

gulp.task('test', done => {
    new KarmaServer({
        configFile: __dirname + '/karma.conf.js',
        singleRun: true
    }, done).start();
});

...产生:

Chrome 50.0.2661 (Mac OS X 10.11.3): Executed 11 of 11 (3 FAILED) (0.066 secs / 0.042 secs)
[17:36:39] 'test' errored after 2.45 s
[17:36:39] Error: 1
    at formatError (/usr/local/lib/node_modules/gulp/bin/gulp.js:169:10)
    at Gulp.<anonymous> (/usr/local/lib/node_modules/gulp/bin/gulp.js:195:15)
    at emitOne (events.js:77:13)
    at Gulp.emit (events.js:169:7)
    at Gulp.Orchestrator._emitTaskDone (/Users/markstickley/workspace/timewarp/node_modules/gulp/node_modules/orchestrator/index.js:264:8)
    at /Users/markstickley/workspace/timewarp/node_modules/gulp/node_modules/orchestrator/index.js:275:23
    at finish (/Users/markstickley/workspace/timewarp/node_modules/gulp/node_modules/orchestrator/lib/runTask.js:21:8)
    at cb (/Users/markstickley/workspace/timewarp/node_modules/gulp/node_modules/orchestrator/lib/runTask.js:29:3)
    at removeAllListeners (/Users/markstickley/workspace/timewarp/node_modules/karma/lib/server.js:336:7)
    at Server.<anonymous> (/Users/markstickley/workspace/timewarp/node_modules/karma/lib/server.js:347:9)
    at Server.g (events.js:260:16)
    at emitNone (events.js:72:20)
    at Server.emit (events.js:166:7)
    at emitCloseNT (net.js:1518:8)
    at doNTCallback1 (node.js:418:9)
    at process._tickCallback (node.js:340:17)

鉴于 done 是一个函数并且 done 的所有包装版本所做的都是调用 done,谁能解释为什么会发生这种情况?

最佳答案

进一步的研究表明,Karma 使用退出代码 (https://karma-runner.github.io/0.13/dev/public-api.html) 解析传递给它的回调:

var Server = require('karma').Server
var server = new Server({port: 9876}, function(exitCode) {
  console.log('Karma has exited with ' + exitCode)
  process.exit(exitCode)
})

如果 done 被传递给 nullundefined ( https://github.com/gulpjs/gulp/blob/master/docs/API.md#gulptaskname--deps-fn ) 以外的任何参数,gulp 将退出运行:

gulp.task('one', function(cb) {
    // do stuff -- async or otherwise
    cb(err); // if err is not null and not undefined, the run will stop, and note that it failed
});

因此,当 done 作为回调直接传递给 Karma 时,Karma 的退出代码导致 gulp 过早退出。将它包装在一个函数中意味着 done 仍然被调用但没有任何参数——导致正常完成。

关于javascript - 为什么将 `done` 函数传递给 Karma 的服务器时会出现 gulp 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37551521/

相关文章:

javascript - 计算属性中的 Vuex getter 在整页加载之前显示未定义

javascript - 不推荐使用 globalstorage。请改用本地存储

node.js - 不使用 http ://before the proxy server name 设置 npm 代理

node.js - 如何在nodejs中导入webpack目标生成的 `main`以外的其他文件?

javascript - 如何在 gulp 中的函数内连接多个 js 文件

javascript - 尝试使用 Type= 和 OnClick= 使两个功能与一个按钮相关联

javascript - 随机变量网格

javascript - 如何用回调包装 promise ?

javascript - 无法从 codenvy 预览/运行 angular.js 项目

javascript - Browserify 和 Gulp 中的 require()