我目前正在混合使用SwiftyStoreKit和PromiseKit来处理应用内购买,我遇到的问题是,如果我在其中一个错误中抛出错误,则 promise 链中的catch块不会被执行/调用reject()函数时命中。

关于我如何实现这些 promise ,您可以在下面看到。

     firstly {
        IAPViewModel.retrieveIAPProducts()
     }.then { products in
        IAPViewModel.purchase(products[1])
     }.ensure {
        // This is to silence the warning of values being unused
        _ = IAPViewModel.validatePurchases()
     }.catch { error in
        UIAlertController.show(message: "Error - \(error._code): \(error.localizedDescription)")
     }

一个围绕Promise的函数的示例,最好的示例可能是我的购买函数,因为用户可以单击“取消”,这将引发错误。见下文。
static func purchase(_ product: SKProduct) -> Promise<Void> {

    let loftyLoadingViewContentModel =  LoftyLoadingViewContentModel(title: "Purchasing".uppercased(), message: "We’re currently processing your\nrequest, for your subscription.")
    UIApplication.topViewController()?.showLoadingView(.popOverScreen, loftyLoadingViewContentModel)

    return Promise { seal in

        SwiftyStoreKit.purchaseProduct(product) { purchaseResult in

            switch purchaseResult {
            case .success(let product):
                if product.needsFinishTransaction {
                    SwiftyStoreKit.finishTransaction(product.transaction)
                }
                seal.fulfill()
                log.info("Purchase Success: \(product.productId)")
            case .error(let error):
                UIApplication.topViewController()?.removeLoadingView()
                seal.reject(error)
            }
        }
    }
}

我设置了一个断点,当我触摸“取消”时遇到了错误情况,但是这并不会触发Promises链中的catch块。我似乎无法把我的手指放在为什么。

最佳答案

设法弄清楚了,我必须通过将此参数添加到(policy: .allErrors)块中来明确设置我希望捕获所有错误。

     firstly {
        IAPViewModel.retrieveIAPProducts()
     }.then { products in
        IAPViewModel.purchase(products[1])
     }.ensure {
        // This is to silence the warning of values being unused
        _ = IAPViewModel.validatePurchases()
     }.catch (policy: .allErrors) { error in
        UIAlertController.show(message: "Error - \(error._code): \(error.localizedDescription)")
     }

关于ios - PromiseKit无法击中链内的陷阱,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53848744/

10-12 00:40