Comments (5)
This does indeed work:
let closure = .object(JSClosure { (arguments: [JSValue]) in
guard let url = arguments.first?.string else {
return JSValue.undefined
}
func wrappedFetch(_ url: String, completion: @escaping (String) -> ()) {
Task {
let data = try await fetch(url)
completion(data)
}
}
let result = JSPromise { resolve in
wrappedFetch(url) { data in
resolve(.success(data))
}
}
return result.jsValue()
})
from javascriptkit.
That would be a great feature to add! I would imagine it as either an overload of JSClosure.init
that takes an async
closure, or a separate JSClosure.async
static method (for clarity) that does something like this:
static func async(_ body: @escaping ([JSValue]) async throws -> JSValue) -> JSClosure {
JSClosure { arguments in
JSPromise { resolver in
Task {
do {
let result = try await body(arguments)
resolver(.success(result))
} catch {
if let jsError = error as? JSError {
resolver(.failure(jsError.jsValue()))
} else {
resolver(.failure(JSError(message: String(describing: error)).jsValue()))
}
}
}
}.jsValue()
}
}
from javascriptkit.
Indeed. If one doesn't need to return the result of the asynchronous call, using Task
inside a JSClosure
should work as it is, right? If this is the case, wrapping the asynchronous call (inside Task
) to a synchronous function that calls a completion handler should do the trick when the result needs to be returned:
let closure = .object(JSClosure { (arguments: [JSValue]) in
guard let url = arguments.first?.string else {
return JSValue.undefined
}
func wrappedFetch(_ url: String, completion: @escaping (String) -> ()) {
Task {
let data = await fetch(url)
completion(data)
}
}
var result: String
wrappedFetch(url) { data in
result = data
}
return result
})
What you suggest above would definitely be cleaner.
from javascriptkit.
I don’t think that code would work. Specifically, I get two compiler errors: “Variable 'result' captured by a closure before being initialized” and “Variable 'result' used before being initialized.” However, you’re correct that if you don’t need to return the result of the asynchronous call (and if you don’t need the JS code to be able to wait for your code to finish running), running the async code in a Task
would work.
from javascriptkit.
Ah, too bad. Now that you mention it, it is clear that the closure can reach the return
statement before the completion handler has set the result. Returning a JSPromise
should work, though.
from javascriptkit.
Related Issues (20)
- Export function returning a JSValue HOT 2
- Arguments in JSClosure HOT 4
- JSPromise(resolver:) usage HOT 3
- Making JSObject hashable HOT 5
- Compile error on macOS 12.2.1 HOT 6
- UserAgent support? HOT 1
- WebSockets implementation HOT 2
- Generate JavaScriptKit `.js` runtime with SwiftPM build tool HOT 6
- `JSNumber` type to support `long long` type in Web API IDL
- PUT request using Fetch HOT 2
- Occasional JSClosure has been already released by Swift side HOT 4
- Compiled module was created by a different version of the compiler; rebuild 'JavaScriptKit' and try again HOT 2
- Cannot perform DataView.prototype.setBigUint64 on a detached ArrayBuffer HOT 2
- JSClosure will be overriden from other closure HOT 1
- Are JSValue bitmasks possible? HOT 2
- `JSClosure.async` doesn't work at all
- Init `JSUInt8ClampedArray` from `[UInt8]` failed
- When targeting macOS, v0.19.0 Requires macOS 14 HOT 1
- Cannot Build Package With JavaScriptKit HOT 4
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from javascriptkit.