Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit f6e7251

Browse files
Update JSPromise publisher for JSKit 0.10 (#4)
* Update `JSPromise` implementation for JSKit 0.10 * Update JavaScriptKit requirement in Package.swift * Update `README.md`
1 parent 064ddd2 commit f6e7251

File tree

5 files changed

+23
-35
lines changed

5 files changed

+23
-35
lines changed

‎Package.resolved‎

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎Package.swift‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ let package = Package(
1010
.package(
1111
name: "JavaScriptKit",
1212
url: "https://github.com/swiftwasm/JavaScriptKit.git",
13-
from: "0.9.0"
13+
from: "0.10.0"
1414
),
1515
.package(url: "https://github.com/TokamakUI/OpenCombine.git", from: "0.12.0-alpha3"),
1616
],

‎README.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import OpenCombine
2828
import OpenCombineJS
2929

3030
private let jsFetch = JSObject.global.fetch.function!
31-
func fetch(_ url: String) -> JSPromise<JSObject, JSError> {
31+
func fetch(_ url: String) -> JSPromise {
3232
JSPromise(jsFetch(url).object!)!
3333
}
3434

@@ -42,7 +42,7 @@ let timer = JSTimer(millisecondsDelay: 1000, isRepeating: true) {
4242
subscription = fetch("https://httpbin.org/uuid")
4343
.publisher
4444
.flatMap {
45-
JSPromise<JSValue, JSError>(0ドル.json!().object!)!.publisher
45+
JSPromise(0ドル.json().object!)!.publisher
4646
}
4747
.mapError { 0ドル as Error }
4848
.map { Result<String, Error>.success(0ドル.uuid.string!) }

‎Sources/OpenCombineJS/JSPromise.swift‎

Lines changed: 16 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -15,46 +15,36 @@
1515
import JavaScriptKit
1616
import OpenCombine
1717

18-
public extension JSPromise where Success:ConstructibleFromJSValue, Failure:JSError{
18+
public extension JSPromise {
1919
final class PromisePublisher: Publisher {
20-
public typealias Output = Success
21-
22-
/// Reference to a parent promise instance to prevent early deallocation
23-
private var parent: JSPromise?
24-
25-
/// Reference to a `then` success callback promise instance to prevent early deallocation
26-
private var then: JSPromise<JSValue, Failure>?
20+
public typealias Output = JSValue
21+
public typealias Failure = JSValue
2722

2823
/// `Future` instance that handles subscriptions to this publisher.
29-
private var future: Future<Success, Failure>?
30-
31-
fileprivate init(parent: JSPromise) {
32-
future = .init { [weak self] resolver in
33-
let then = parent.then { value -> JSValue in
34-
resolver(.success(value))
35-
return .undefined
36-
}
37-
38-
then.catch {
24+
private var future: Future<JSValue, JSValue>
25+
26+
fileprivate init(promise: JSPromise) {
27+
future = .init { resolver in
28+
promise.then(success: {
29+
resolver(.success(0ドル))
30+
return JSValue.undefined
31+
}, failure: {
3932
resolver(.failure(0ドル))
40-
}
41-
self?.then = then
33+
returnJSValue.undefined
34+
})
4235
}
43-
self.parent = parent
4436
}
4537

4638
public func receive<Downstream: Subscriber>(subscriber: Downstream)
47-
where Success == Downstream.Input,Failure == Downstream.Failure
39+
where Downstream.Input == JSValue, Downstream.Failure == JSValue
4840
{
49-
guard let parent = parent, let then = then, let future = future else { return }
50-
51-
future.receive(subscriber: WrappingSubscriber(inner: subscriber, parent: parent, then: then))
41+
future.receive(subscriber: WrappingSubscriber(inner: subscriber))
5242
}
5343
}
5444

5545
/// Creates a new publisher for this `JSPromise` instance.
5646
var publisher: PromisePublisher {
57-
.init(parent: self)
47+
.init(promise: self)
5848
}
5949

6050
/** Helper type that wraps a given `inner` subscriber and holds references to both stored promises
@@ -66,8 +56,6 @@ public extension JSPromise where Success: ConstructibleFromJSValue, Failure: JSE
6656
typealias Failure = Inner.Failure
6757

6858
let inner: Inner
69-
let parent: JSPromise
70-
let then: JSPromise<JSValue, Failure>
7159

7260
var combineIdentifier: CombineIdentifier { inner.combineIdentifier }
7361

‎Sources/OpenCombineJSExample/main.swift‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import OpenCombine
33
import OpenCombineJS
44

55
private let jsFetch = JSObject.global.fetch.function!
6-
func fetch(_ url: String) -> JSPromise<JSObject,JSError> {
6+
func fetch(_ url: String) -> JSPromise {
77
JSPromise(jsFetch(url).object!)!
88
}
99

@@ -17,7 +17,7 @@ let timer = JSTimer(millisecondsDelay: 1000, isRepeating: true) {
1717
subscription = fetch("https://httpbin.org/uuid")
1818
.publisher
1919
.flatMap {
20-
JSPromise<JSValue,JSError>(0ドル.json!().object!)!.publisher
20+
JSPromise(0ドル.json().object!)!.publisher
2121
}
2222
.mapError { 0ドル as Error }
2323
.map { Result<String, Error>.success(0ドル.uuid.string!) }

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /