如何取消尚未履行或拒绝的承诺?
PromiseKit的文档谈到取消承诺,但我找不到如何执行此操作的具体示例。
鉴于:
currentOperation = client.load(skip: skip, query: nil)
currentOperation!.then { (items) in
self.processItems(items: items, skip: skip, query: query)
}.catch { (error) in
print("failed to load items - just retrying")
self.loadIfNeeded(skip: skip, query: query, onlyInStock: onlyInStock)
}
如果查询发生变化(用户在搜索栏中输入了一些文字),我想取消并放弃currentOperation
,开始新的承诺。
答案 0 :(得分:3)
为了取消承诺,您必须使用符合CancellableError
协议的任何错误类型拒绝承诺。这样,policy
参数设置为allErrorsExceptCancellation
的任何catch块都会让错误通过。
如果你需要一个CancellablePromise,你可以继承Promise并实现一个cancel()函数,该函数在被调用时会被CancellableError
拒绝。这是一个最小的实现:
https://gist.github.com/EfraimB/918eebdf7dd020801c72da1289c8d797
更新:
以下是新PromiseKit版本(6.4.1)的更新
https://gist.github.com/EfraimB/3ac240fc6e65aa8835df073f68fe32d9
答案 1 :(得分:2)
也许我的图书馆CancellablePromiseKit对您有用:https://github.com/johannesd/CancellablePromiseKit
它允许您定义一个CancellablePromise,类似于您定义普通Promise的方式,并添加了一个取消块。在该块中,您编写用于取消基础任务的代码。然后可以通过从外部调用cancellablePromise.cancel()取消承诺。
let cancellablePromise = CancellablePromise<String> { resolver in
let currentOperation = client.load(skip: skip, query: nil)
currentOperation.completion = { (value, error) in
resolver.resolve(value, error)
}
return {
// The cancel block
currentOperation.stop()
}
}
lib也会在自动取消任务时自动重载。
答案 2 :(得分:1)
在 PromiseKit 7 中,使用 func cancellize()
将 Promise
或 Guarantee
转换为可以取消的承诺:
currentOperation = client.load(skip: skip, query: nil)
let currentOperationCancellable = currentOperation!.then { (items) in
self.processItems(items: items, skip: skip, query: query)
}.cancellize()
currentOperationCancellable.catch { (error) in
print("failed to load items - just retrying")
self.loadIfNeeded(skip: skip, query: query, onlyInStock: onlyInStock)
}
使用 func cancel()
或 func cancel(with:)
取消可取消的 Promise
或 Guarantee
:
currentOperationCancellable.cancel()
currentOperationCancellable.cancel(with: NSError(domain: "", code: 0, userInfo: nil))