(bluebird)承诺中的grunt无声错误吗?

时间:2015-12-11 12:25:49

标签: node.js error-handling gruntjs promise

我有一个以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运行相同的代码,一切都会变得无声无息。也不会调用catchfinally

造成这种情况的原因。似乎Grunt劫持错误被抛出。

它很容易重现这一点,但我对此感到困惑。

Grunt是否会以某种方式劫持被抛出的错误,所以甚至连Promise的捕获都没有被调用?

如果Grunt执行代码,那么如果手动执行,执行和错误处理会如此不同?

1 个答案:

答案 0 :(得分:0)

您正在寻找定义异步任务。这可以使用this.async()

完成
grunt.registerTask("build",function() {
    // Tell Grunt this task is asynchronous.
    var done = this.async();
    mynpm.build();
});

有关异步任务的详细信息,请访问:Spark