                 onDisposed: { [weak self] in
                     self?.transactions.removeDisposable(transactionId)
                     BleError.cancelled().callReject(promise)
+                    if let id = characteristicIdentifier {
+                        let reads = self?.pendingReads[id] ?? 0
+                        if reads > 0 {
+                            self?.pendingReads[id] = reads - 1
+                        }
+                    }
                 }
             )
 

            _ = device.cancelConnection().subscribe()
        }
        connectedPeripherals.removeAll()
    }

    deinit {

    private func safeReadCharacteristicForDevice(_ characteristicObservable: Observable<Characteristic>,
                                                              transactionId: String,
                                                                    promise: SafePromise) {
        var characteristicIdentifier: Double? = nil
        let disposable = characteristicObservable
            .flatMap { [weak self] characteristic -> Observable<Characteristic> in
                characteristicIdentifier = characteristic.jsIdentifier
                let reads = self?.pendingReads[characteristic.jsIdentifier] ?? 0
                self?.pendingReads[characteristic.jsIdentifier] = reads + 1
                return characteristic.readValue()
            }
            .subscribe(
                onNext: { characteristic in
                    promise.resolve(characteristic.asJSObject)
