将 gulp 回调直接传递给 promise 时出现异常
Exception when passing gulp callback directly to promise
我定义了 gulp 任务 'clean-code' 和函数 'clean' 如下
gulp.task('clean-code', function (done) {
var files = ...;
clean(files, done);
});
function clean (path, done) {
del(path).then(done);
}
出现错误
/usr/local/bin/node /usr/local/lib/node_modules/gulp/bin/gulp.js --color --gulpfile /Users/[path to project]/Gulpfile.js clean-code
[11:45:04] Using gulpfile /Users/[path to project]/Gulpfile.js
[11:45:04] Starting 'clean-code'...
[11:45:04] Cleaning: ./.tmp/**/*.js,./build/**/*.html,./build/js/**/*.js
[11:45:04] 'clean-code' errored after 8.68 ms
[11:45:04] Error
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/[path to project]/node_modules/gulp/node_modules/orchestrator/index.js:264:8)
at /Users/[path to project]/node_modules/gulp/node_modules/orchestrator/index.js:275:23
at finish (/Users/[path to project]/node_modules/gulp/node_modules/orchestrator/lib/runTask.js:21:8)
at cb (/Users/[path to project]/node_modules/gulp/node_modules/orchestrator/lib/runTask.js:29:3)
但是当我按照以下方式重构函数 'clean' 时一切正常
function clean (path, done) {
var f = function () {
done();
};
del(path).then(f);
}
我不明白区别在哪里以及为什么用 f 完成包装使任务正常工作
假设您正在使用 this 库,为 del
函数返回的 Promise 实际上 returns 一个参数 paths
毫无价值。您可以验证此参数是否存在,如下所示:
function clean (path, done) {
del(path).then(function(paths) {
console.log(paths);
done();
});
}
在您的代码中:
function clean (path, done) {
del(path).then(done);
}
会将 paths
参数转发给 done 函数,该函数会将其解释为导致应用程序崩溃的错误参数。通过自己调用 done()
,不会转发任何参数,任务将正确执行。
我定义了 gulp 任务 'clean-code' 和函数 'clean' 如下
gulp.task('clean-code', function (done) {
var files = ...;
clean(files, done);
});
function clean (path, done) {
del(path).then(done);
}
出现错误
/usr/local/bin/node /usr/local/lib/node_modules/gulp/bin/gulp.js --color --gulpfile /Users/[path to project]/Gulpfile.js clean-code
[11:45:04] Using gulpfile /Users/[path to project]/Gulpfile.js
[11:45:04] Starting 'clean-code'...
[11:45:04] Cleaning: ./.tmp/**/*.js,./build/**/*.html,./build/js/**/*.js
[11:45:04] 'clean-code' errored after 8.68 ms
[11:45:04] Error
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/[path to project]/node_modules/gulp/node_modules/orchestrator/index.js:264:8)
at /Users/[path to project]/node_modules/gulp/node_modules/orchestrator/index.js:275:23
at finish (/Users/[path to project]/node_modules/gulp/node_modules/orchestrator/lib/runTask.js:21:8)
at cb (/Users/[path to project]/node_modules/gulp/node_modules/orchestrator/lib/runTask.js:29:3)
但是当我按照以下方式重构函数 'clean' 时一切正常
function clean (path, done) {
var f = function () {
done();
};
del(path).then(f);
}
我不明白区别在哪里以及为什么用 f 完成包装使任务正常工作
假设您正在使用 this 库,为 del
函数返回的 Promise 实际上 returns 一个参数 paths
毫无价值。您可以验证此参数是否存在,如下所示:
function clean (path, done) {
del(path).then(function(paths) {
console.log(paths);
done();
});
}
在您的代码中:
function clean (path, done) {
del(path).then(done);
}
会将 paths
参数转发给 done 函数,该函数会将其解释为导致应用程序崩溃的错误参数。通过自己调用 done()
,不会转发任何参数,任务将正确执行。