我有一个以main()
函数为起点的npm模块。
现在,让我说我在main()
中即时抛出错误,如下所示:
function main() {
throw new Error("An error!");
}
然后用node my-app-that-launchers-main.js
执行它,然后很明显,错误被抛出,我得到一个堆栈跟踪。
如果我为此写了一个笨拙的任务:
var mynpm = require("mynpm");
module.exports = function(grunt) {
grunt.registerTask("build",function() {
mynpm.build();
});
}
通过Grunt执行,然后失败。正如预期的那样,抛出错误并且grunt失败。
但是,如果我把这个投掷包装在Bluebird Promise中:
function main() {
Promise.try(function(resolve) {
throw new Error("An error!");
} ).catch(function() {
console.log("error");
} ).finally(function() {
console.log("finally");
});
}
然后通过node
运行它,然后我看到调用了catch
函数。正如所料。
但是,如果我通过Grunt的registertask运行相同的代码,一切都会变得无声无息。也不会调用catch
或finally
。
造成这种情况的原因。似乎Grunt劫持错误被抛出。
它很容易重现这一点,但我对此感到困惑。
Grunt是否会以某种方式劫持被抛出的错误,所以甚至连Promise的捕获都没有被调用?
如果Grunt执行代码,那么如果手动执行,执行和错误处理会如此不同?
答案 0 :(得分:0)
您正在寻找定义异步任务。这可以使用this.async()
:
grunt.registerTask("build",function() {
// Tell Grunt this task is asynchronous.
var done = this.async();
mynpm.build();
});
有关异步任务的详细信息,请访问:Spark