gpt4 book ai didi

ios - PromiseKit 依赖 promise 导致提前释放

转载 作者:行者123 更新时间:2023-11-28 15:43:09 27 4
gpt4 key购买 nike

我正在尝试使用 PromiseKit 驯服厄运代码的回调 hell 金字塔.

为此,我将我的异步代码包装在 promise 中,但是根据我返回依赖 promise 的方式,我遇到了问题。如果我打开 promise 并履行/拒绝那么一切都很好,尽管比我想要的更冗长。如果我返回一个新的依赖 promise,那么我会得到一个早期的分配,并且 promise 会被默默地打破。

我意识到这可能不是惯用的 PromiseKit,它似乎是

{ a }.then { b }.then { c }  // in temporal order, take that, callbacks!

但作为这项工作的一部分,我可以方便地使用函数进行重构 Promise<A> -> Promise<B> ,而且我不明白为什么我必须在每一步都展开。有人知道吗?

这里是一些重现问题的简化代码。试着想象有一个很好的理由 badStringFromInt无法立即履行。

func badStringFromInt(_ intPromise: Promise<Int>) -> Promise<String> {
return Promise { _, reject in
intPromise.then { i -> Promise<String> in
return Promise { fulfill, _ in
fulfill("\(i)")
}
}.catch { error in
reject(error)
}
}
}

func goodStringFromInt(_ intPromise: Promise<Int>) -> Promise<String> {
return Promise { fulfill, reject in
intPromise.then { i in
fulfill("\(i)")
}.catch { error in
reject(error)
}
}
}

func getInt() -> Promise<Int> {
return Promise{ fulfill, reject in
fulfill(5)
}
}

func doIt() {
// "then" never called, and this is logged:
// PromiseKit: Pending Promise deallocated! This is usually a bug
badStringFromInt(getInt()).then { s in
print("bad string is :" + s)
}.catch { error in
print("error: \(error)")
}

// all good!
goodStringFromInt(getInt()).then { s in
print("good string is :" + s)
}.catch { error in
print("error: \(error)")
}
}

最佳答案

我一定是遗漏了什么。为什么不直接添加到链中呢?创建中间 promise 对您有什么作用?

betterStringFromInt 等待 intPromise 完成,然后返回一个字符串 promise 。

func betterStringFromInt(_ intPromise: Promise<Int>) -> Promise<String> {
return intPromise.then { i in
DispatchQueue.main.promise {
return "\(i)"
}
}
}

关于ios - PromiseKit 依赖 promise 导致提前释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43462008/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com