我和我的同事正在构建一个基于PromiseKit v1.5.3的异步数据层。我们注意到,在某些情况下,当从传递给then
的块返回承诺(称为X)时,下一个then
块实际上将承诺X作为参数传递给块,而不是前一个承诺实际解析到的。对于大多数Promise实现来说,链接then承诺是一个非常重要的特性,所以我们非常惊讶。
经过一些相当长的调试会话后,我们发现问题在PromiseKit中。在解析过程中,IsPromise
调用无法将对象识别为promise,这实际上是对
[result isKindOfClass:[PMKPromise class]]
这个调用返回nil
,执行了一个错误的分支。这是来源
令人困惑的是,我看不出有任何理由会发生这种情况。我不认为这是一个错误在PromiseKit,因为他们的代码似乎是健全的。我已经确认底层对象确实是一个PMKPromise,因为它响应承诺方法,如value
和fulfilled
。我甚至用调试器把它推到正确的分支,它从那里正确地执行!
这是一个有趣的日志,从一些测试,当停止在给定的行。
给定isKindOfClass
返回nil
,听起来该对象没有响应消息…但它肯定是一个NSObject。我很好奇,如果这可能是一个奇怪的编译器设置或什么的。如果相关的话,我目前将我的优化设置为none。有人见过这样的东西或者知道发生了什么吗?我应该检查什么?
isKindOfClass返回意想不到的结果,当你设法有相同的类两次在您的项目。因此,您可能有一个类PMKPromise的对象,但它是一个不同的类(具有完全相同的类名,完全相同的行为,只是第二个类)。也许就是这样。显然,设置一个断点并检查对象是什么会有所帮助。