首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PromiseKit取消承诺

PromiseKit取消承诺
EN

Stack Overflow用户
提问于 2017-05-11 05:17:02
回答 3查看 6.3K关注 0票数 9

我如何取消既未兑现也未被拒绝的承诺?

PromiseKit的文档讨论了取消承诺的问题,但我找不到一个具体的例子来说明如何做到这一点。

给予:

代码语言:javascript
复制
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,开始一个新的承诺。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-06-02 18:55:05

在PromiseKit 7中,使用func cancellize()PromiseGuarantee转换为可以取消的承诺:

代码语言:javascript
复制
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:)取消可取消的PromiseGuarantee

代码语言:javascript
复制
currentOperationCancellable.cancel()
currentOperationCancellable.cancel(with: NSError(domain: "", code: 0, userInfo: nil))
票数 1
EN

Stack Overflow用户

发布于 2018-01-08 14:24:52

为了取消承诺,您必须拒绝任何符合CancellableError协议的错误类型。这样,任何将policy参数设置为allErrorsExceptCancellation的catch块都将允许错误通过。

如果您需要一个CancellablePromise,您可以使用子类承诺并实现一个cancel()函数,该函数在调用CancellableError时将被拒绝。下面是一个最低限度的实现:

https://gist.github.com/EfraimB/918eebdf7dd020801c72da1289c8d797

更新:

以下是新PromiseKit版本的更新(6.4.1)

https://gist.github.com/EfraimB/3ac240fc6e65aa8835df073f68fe32d9

票数 6
EN

Stack Overflow用户

发布于 2018-05-20 17:35:24

也许我的库CancellablePromiseKit对您有用:https://github.com/johannesd/CancellablePromiseKit

它允许您定义一个CancellablePromise,类似于您如何定义一个普通的承诺,并添加了一个cancel块。在该块中,编写用于取消基础任务的代码。然后,可以通过从外部调用cancellablePromise.cancel()来取消承诺。

代码语言:javascript
复制
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()
    }
}

库还会自动重载“何时”和“竞相取消”任务。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43907061

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档