【问题标题】:Does my Promise implementation agree with specifications?我的 Promise 实现是否符合规范?
【发布时间】:2014-06-09 02:48:35
【问题描述】:

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

应该可以了,代码在这里https://gist.github.com/ilmattodel93/dbefa9eb86715f76e10e,但是我看不懂规范的2.2.7子点。只有种族和所有的静态方法应该被遗漏。

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

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

【问题讨论】:

  • 为什么不运行测试套件?
  • 快速浏览代码至少有 2 个错误:您的 .then() 返回 this(这实际上不仅是错误,而且错过了承诺的全部要点)而您没有在x.then 附近尝试一下。从github.com/promises-aplus/promises-tests 运行测试套件。
  • 我尝试了好几个小时来使用测试套件来测试我的实现,我重写了它,但没有办法,仍然失败了很多关于 then 对象方法的测试。这是新代码:gist.github.com/ilmattodel93/dbefa9eb86715f76e10e/… 仍然没有通过很多测试:/ 为什么?我已经实现了规范所说的代码......我想。 ://
  • 这个问题似乎跑题了,因为它是关于代码审查的。

标签: javascript typescript promise ecmascript-6


【解决方案1】:

让我们让代码来说话。假设我们有一个名为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 一起使用。

【讨论】:

  • 即使在实现了这个之后,也保证不会通过测试:/
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2014-07-20
    • 1970-01-01
    • 2011-03-11
    • 2016-09-01
    • 2017-05-31
    • 1970-01-01
    • 2020-07-14
    • 2012-02-17
    • 1970-01-01
    相关资源
    最近更新 更多