Skip to content

when does not work as expected when using cancelOnFailure: true #20

@julasamer

Description

@julasamer

when(fulfilled: promises, cancelOnFailure: true) does not seem to propagate cancel calls correctly - when requestCancel is called on the resulting promises, the sub-promises never receive a cancel request. This only happens with cancelOnFailure=true.

Below is my unit test reproducing the issue: The promise completes successfully even though cancel was called. didCancel is never set to true.

func testCancelingWhen() {
    var didCancel = false
    var resolveHooks: [()->()] = []
    let expectation = XCTestExpectation(description: ".always is called")
    
    let createPromise = {
        return Promise<(), NoError>(on: .main) {
            resolver in
            
            resolver.onRequestCancel(on: .immediate) {
                resolver in
                didCancel = true
                resolver.cancel()
            }
            
            resolveHooks.append {
                resolver.fulfill(with: ())
            }
        }
    }
    
    DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
        resolveHooks.forEach { hook in hook() }
    }
    
    let whenPromise = when(fulfilled: [createPromise(), createPromise()], cancelOnFailure: true).then {
        _ in
        XCTFail("Should not complete.")
    }
    
    whenPromise.requestCancel()
    
    whenPromise.always {
        _ in
        expectation.fulfill()
        XCTAssert(didCancel, "No cancel was propagated.")
    }
    
    wait(for: [expectation], timeout: 1)
}

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions