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