Javascript 节点调试:监视表达式产生与exec console.log不同的结果
我正在实现我自己的承诺A+兼容包只是为了好玩。在测试过程中,出现了错误,而我现在很难解决它 我正试着用这个来测试它。导致问题的测试用例都是测试“如果/当Javascript 节点调试:监视表达式产生与exec console.log不同的结果,javascript,node.js,debugging,Javascript,Node.js,Debugging,我正在实现我自己的承诺A+兼容包只是为了好玩。在测试过程中,出现了错误,而我现在很难解决它 我正试着用这个来测试它。导致问题的测试用例都是测试“如果/当y是一个表的一个表…”(已描述) 以下是第一次失败测试的说明: 承诺承诺/A+测试2.3.3:否则,如果x是一个对象或函数,2.3.3.3:如果那么是一个函数,用x调用它,作为此,第一个参数resolvePromise,第二个参数rejectPromise2.3.3.1:如果使用值y调用resolvePromise,则运行[[Resolve]](
y
是一个表的一个表…”(已描述)
以下是第一次失败测试的说明:
承诺承诺/A+测试2.3.3:否则,如果x
是一个对象或函数,2.3.3.3:如果那么是一个函数,用x
调用它,作为此
,第一个参数resolvePromise
,第二个参数rejectPromise
2.3.3.1:如果使用值y
调用resolvePromise
,则运行[[Resolve]](promise,y)
y
是一个表的表y
是一个同步实现的自定义表的已实现承诺,然后
通过从已实现承诺返回同步调用resolvePromise
以下是我编写适配器的方式:
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;
};
奇怪的事情开始了。其中一个测试试图评估,当一个承诺产生一个对一个承诺的承诺时,它将以相同的价值实现
我遇到了一些奇怪的错误,所以我一直试着调试它
发生了什么:当调试器到达上述代码中的断点时,watch
的行为异常
如果我运行watch('onFulfill')
,观察者将给我:
0: onFulfill = undefined
但是如果我执行exec console.log(onFulfill)
,它将打印:
< [Function: onBasePromiseFulfilled]
在调试器控制台中,它为我提供:
< { state: State('pending'), queue: [] }
程序崩溃,给了我一个终止错误。我试图重现这个错误,但是你的适配器看起来不像:适配器中描述的那样。延迟的
应该是一个函数。修改适配器后,我使用节点检查器对其进行了调试
即使在修复了适配器之后,我也确实在mocha调试控制台中遇到了一些奇怪的行为,但这是我第一次使用node/mocha进行调试,所以我不知道它是否真的很奇怪。没有终止错误,但是尝试console.log
一些明确定义的变量显示为未定义
此外,在不修改适配器的情况下,运行测试几乎立即失败,并显示一条清晰的错误消息。Se我们可能以不同的方式运行测试,或者如果您不明白的话,我们的设置会有所不同
以下是我使用的适配器:
var adapter = (function() {
var res, rej;
return {
deferred: function() {
return {
promise: new Promise(function(resolve, reject){
res = resolve;
rej = reject;
}),
resolve: res,
reject: rej,
};
}
}
})();
让我们知道是哪个测试导致了问题,这会很有帮助。我已经编辑了问题,解释了哪些问题。你能提供更多关于终止错误的信息吗?这就是问题所在!根本没有错误描述,它只是说执行已终止。我试图重现此错误,但您的适配器与自述文件中描述的不一样:adapter.deferred应该是一个函数。修改适配器后,我使用节点检查器对其进行了调试
> exec console.log(p)
var adapter = (function() {
var res, rej;
return {
deferred: function() {
return {
promise: new Promise(function(resolve, reject){
res = resolve;
rej = reject;
}),
resolve: res,
reject: rej,
};
}
}
})();