2

我的同事和我正在构建一个基于PromiseKit v1.5.3 的异步数据层。我们注意到,在某些情况下,当从传递给的块返回一个承诺(称为 X)时then,下一个then块实际上将 Promse X 作为参数传递给该块,而不是前一个承诺实际解析为的参数。对于大多数 Promise 实现来说,链接 thenable Promise 是一个非常重要的特性,所以我们非常惊讶。

经过一些相当长的调试会话后,我们发现问题出在 PromiseKit 中。在解析过程中,IsPromise调用未能将对象识别为promise,这实际上是一个简单的调用

[result isKindOfClass:[PMKPromise class]]

此调用返回nil,并执行了不正确的分支。这是来源

令人费解的是,我认为没有任何理由发生这种情况。我不认为这是 PromiseKit 中的错误,因为他们的代码似乎是正确的。我已经确认底层对象确实是一个 PMKPromise,因为它响应诸如value和之类的 promise 方法fulfilled。我什至使用调试器将它推过正确的分支,并从那里正确执行!

这是在给定行停止时来自一些测试的有趣日志。

鉴于isKindOfClass正在返回nil,听起来该对象没有响应消息......但它肯定是一个 NSObject。我很好奇这是否可能是一个奇怪的编译器设置或其他东西。如果相关,我目前将优化设置为无。有没有人见过这样的事情或知道发生了什么?我应该检查什么?

4

1 回答 1

3

当您设法在项目中两次拥有相同的类时,isKindOfClass 会返回意外结果。所以你可能有一个 PMKPromise 类的对象,但它是一个不同的类(具有完全相同的类名,完全相同的行为,只是第二个类)。也许这就是发生的事情。显然设置断点并检查对象是什么会有所帮助。

于 2015-05-23T22:57:48.123 回答