节点调试:watch表达式产生与exec console.log不同的结果

时间:2016-01-09 14:52:27

标签: javascript node.js debugging

我正在实现我自己的Promise A +兼容包,只是为了好玩。在测试时,错误来了,我现在遇到了解决问题的时候。

我正试图针对Promise A+ Test Suite进行测试。导致问题的测试用例都是测试“If / when y对于一个可能的人来说......”(描述为here)。

以下是第一次失败测试的描述:

  

承诺承诺/ A +测试2.3.3:否则,如果x是对象或函数,2.3.3.3:如果then是函数,则使用x作为{调用它{1}},第一个参数this和第二个参数resolvePromise 2.3.3.3.1:如果/ rejectPromise使用值resolvePromise进行调用,请运行y } [[Resolve]](promise, y)是一个值得关注的y是一个已经履行的承诺,通过从履行的承诺中返回,同步实现的y调用then同步履行

这就是我编写适配器的方式:

resolvePromise

以下是完整实施的gist。问题出现在以下部分:

var adapter = (function() {
    var res, rej;
    return {
        defered: {
            promise: new Promise(function(resolve, reject){
                res = resolve;
                rej = reject;
            }),
            resolve: res,
            reject: rej,
        }
    }
})();

describe("Promises/A+ Tests", function () {
    require("promises-aplus-tests").mocha(adapter);
});

这是奇怪的事情开始的时候。其中一项测试试图评估当承诺产生对承诺的承诺时,它将以相同的值实现。

我遇到了一些奇怪的错误,所以我试图一直调试它。

发生了什么:当调试器到达上面代码中的断点时,Promise.prototype.then = function(onFulfill, onReject) { let p = new Promise(); debugger; let pending = { fulfill: isFunction(onFulfill) ? onFulfill : v => v, reject: isFunction(onReject) ? onReject : e => { throw e }, promise: p, }; this.queue.push(pending); run.call(this); return p; }; 表现得非常奇怪。

如果我运行watchwatch('onFulfill')会给我:

watchers

但如果我0: onFulfill = undefined ,它会打印出来:

exec console.log(onFulfill)

这里发生了什么?

编辑:

当我在< [Function: onBasePromiseFulfilled] 语句中停止创建debugger变量时,如果我输入:

p

在调试器控制台中,它给了我:

> p

但如果我尝试这样做:

< { state: State('pending'), queue: [] }

程序崩溃,给我一个终止错误。

1 个答案:

答案 0 :(得分:1)

我尝试重现这一点,但您的适配器看起来并不像the readme中描述的那样:adapter.deferred应该是一个函数。修改适配器后,我设法使用node-inspector对其进行调试。

即使修复了适配器,我确实在mocha调试控制台上遇到了一些奇怪的行为,但是我第一次使用node / mocha进行调试,所以我不知道它是否真的很奇怪。没有终止错误,但尝试console.log某些明确定义的变量是未定义的。

此外,在不修改适配器的情况下,运行测试几乎立即失败并显示错误消息。我们可能正在以不同的方式运行测试,或者如果你没有得到它,我们的设置会有所不同。

这是我使用的适配器:

var adapter = (function() {
    var res, rej;
    return {
        deferred: function() { 
            return {
                promise: new Promise(function(resolve, reject){
                    res = resolve;
                    rej = reject;
                }),
                resolve: res,
                reject: rej,
            };
        }
    }
})();