我正在实现我自己的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
同步履行1}} 1} p>
这就是我编写适配器的方式:
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;
};
表现得非常奇怪。
如果我运行watch
,watch('onFulfill')
会给我:
watchers
但如果我0: onFulfill = undefined
,它会打印出来:
exec console.log(onFulfill)
这里发生了什么?
当我在< [Function: onBasePromiseFulfilled]
语句中停止创建debugger
变量时,如果我输入:
p
在调试器控制台中,它给了我:
> p
但如果我尝试这样做:
< { state: State('pending'), queue: [] }
程序崩溃,给我一个终止错误。
答案 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,
};
}
}
})();