2014-04-24 48 views
1

我正在尝试创建一个符合当前规范(我使用这些http://promises-aplus.github.io/promises-spec/)的Typescript承诺实现(实际上是一个polyfill)。我的承诺是否符合规格?

应该这样做,代码在这里https://gist.github.com/ilmattodel93/dbefa9eb86715f76e10e,但我无法理解规范的2.2.7子点。只有种族和所有静态方法应该丢失。

请有人能解释我的2.2.7子点,并告诉我,如果我已经正确实施他们?

感谢您的关注和时间, 马蒂亚。

+0

为什么不运行测试套件? –

+2

快速浏览代码至少有2个错误:你的'.then()'返回'this'(这实际上不仅是一个错误,而且错过了promise的全部点),并且你没有try catch围绕'x.then'。从https://github.com/promises-aplus/promises-tests运行测试套件。 – Esailija

+0

我试了好几个小时来使用测试套件来测试我的实现,我重写了它,但没办法,仍然失败了很多有关then方法与对象的测试。这是新的代码:https://gist.github.com/ilmattodel93/dbefa9eb86715f76e10e/082cd93623e061727df728a9993e4f24caf24597仍然失败了很多测试:/为什么?我已经实现了代码,因为规范说...我想。 :/ –

回答

2

让我们让代码进行谈话。可以说我们有一个叫做promise1的承诺。根据规范:

从规格

则必须返回一个承诺

自我explainatory:

promise2 = promise1.then(onFulfilled, onRejected); 

从规格

如果onFulfilled或onRejected返回值x,请运行Promise Resolution Procedure [[Resolve]](promise2,x)。

如果我们有

promise2 = promise1.then(()=>123,()=>123); 

然后,你可以做

promise2.then((x)=> /* x should be 123 */, (x)=> /* will not be called */); 

从规格

如果任onFulfilled或onRejected抛出一个异常E,promise2必须以e拒绝为理由。

如果我们有

promise2 = promise1.then(()=> { throw new Error('message'); },()=> { throw new Error('message'); }); 

然后,你可以做

promise2.then((x)=> /* should not be called */, (x)=> /* x will be equal to "new Error('message')" */); 

从规格

如果onFulfilled不是一个函数和promise1满足,promise2必须用相同的价值来实现。

如果我们有

promise1 = new Promise(function(resolve,reject) { resolve(123) }); 
promise2 = promise1.then(null,null); 

然后我们可以做

promise2.then((x)=> /* x should be 123 */, (x)=> /* should not be called */); 

从规格

如果onRejected不是一个函数和promise1被拒绝,promise2必须被同样的理由拒绝。

如果我们有

promise1 = new Promise(function(resolve,reject) { reject(123) }); 
promise2 = promise1.then(null,null); 

然后我们可以做

promise2.then((x)=> /* should not be called */, (x)=> /* x should be 123 */); 

要验证是否执行写入测试,如图所示。我建议与Chai一起使用Mocha。

+0

即使执行此操作后,承诺不通过测试:/ –