1

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

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

请有人可以向我解释 2.2.7 的子点并告诉我是否正确实施了它们?

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

4

2 回答 2

2

让我们让代码来说话。假设我们有一个叫做promise1. 根据规范:

从规格

然后必须返回一个承诺

自我解释:

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 */);

要验证您是否实现编写测试,如图所示。我建议将 Mocha 与 Chai 一起使用。

于 2014-04-24T04:01:01.773 回答
0

您还可以检查您的 TypeScript 定义是否与规范的 Promise/A+ 定义兼容。这是规范承诺的 TypeScript 代码:FretainlyTyped on GitHub

于 2014-04-28T13:41:37.270 回答