Comments (6)
from promises.
Hi @umbri, sorry, I don't completely understand. Do you propose to reject a promise with some predefined cancelled
error and provide a special catch
version to handle only those? In the example above a simple shared bool
flag seems sufficient...
from promises.
@shoumikhin Hi,
let me show a real world example: (simplified)
func testPromise() -> Promise<[Icon]> {
return Promise<[Icon]>(on: .global(qos: .userInitiated)) {
return self.loadHtml()
.then({ (html) -> Promise<[URL]> in
return self.parseHtml(with: html)
})
.then({ (urls) -> Promise<[Icon]> in
return Promises.any([
self.faviconByUrl(urls: urls),
Promises.all([
self.faviconSmall(),
self.faviconAppleTouch()
])
])
.then({ (result: [Maybe<[Icon]>]) -> Promise<[Icon]> in
fatalError() // do some transformations here ...
})
})
}
}
func loadHtml() -> Promise<String> {
fatalError()
}
func faviconAppleTouch() -> Promise<Icon> {
fatalError()
}
func faviconSmall() -> Promise<Icon> {
fatalError()
}
func faviconByUrl(urls: [URL]) -> Promise<[Icon]> {
return Promises.all(urls.map { self.download(url: $0) })
}
func parseHtml(with: String) -> Promise<[URL]> {
fatalError()
}
func download(url: URL) -> Promise<Icon> {
fatalError()
}
imagine you have something like this, and you don't know when user will cancel all this promise chain testPromise
, we need a simple method to do this
from promises.
I see 2 approaches here:
- something like this https://github.com/vadymmarkov/When#fail , but we must have access to promise state discussed here: #31 to know when to reject the long running promise, imagine:
download
will come in chunks, and promise is already started, we can get some chunks and the check if promise was rejected and rejectdownloadTask
- something like this:
https://gist.github.com/umbri/7413f4c9b41cfc210561e01b6165a23e, will be used like this:
func testIntegration2() {
let token = CancellationToken()
self.testPromise(token: token)
.then { (icons) in
// on success
}
.catch { (error) in
// on fail or cancel
}
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
token.cancel() // simulate cancel
}
}
func testPromise(token: CancellationToken? = nil) -> Promise<[Icon]> {
return Promise<[Icon]>(on: .global(qos: .userInitiated)) {
return self.loadHtml(token: token)
.then({ (html) -> Promise<[URL]> in
return self.parseHtml(with: html)
})
.then({ (urls) -> Promise<[Icon]> in
return Promises.any([
self.faviconByUrl(urls: urls, token: token),
Promises.all([
self.faviconSmall(token: token),
self.faviconAppleTouch(token: token)
])
])
.then({ (result: [Maybe<[Icon]>]) -> Promise<[Icon]> in
fatalError() // do some transformations here ...
})
})
}
}
func loadHtml(token: CancellationToken? = nil) -> Promise<String> {
fatalError()
}
func faviconAppleTouch(token: CancellationToken? = nil) -> Promise<Icon> {
fatalError()
}
func faviconSmall(token: CancellationToken? = nil) -> Promise<Icon> {
fatalError()
}
func faviconByUrl(urls: [URL], token: CancellationToken? = nil) -> Promise<[Icon]> {
return Promises.all(urls.map { self.download(url: $0) })
}
func parseHtml(with: String) -> Promise<[URL]> {
fatalError()
}
func download(url: URL, token: CancellationToken? = nil) -> Promise<Icon> {
return Promise {
let request = URLRequest(url: url)
let task = URLSession(configuration: .ephemeral).dataTask(with: request) { data, response, error in
// fulfill or resolve
}
try token?.onCancel {
task.cancel()
}
task.resume()
}
}
from promises.
Hi @umbri, did you see this example? Does it look like something you may find useful?
from promises.
Hi @umbri, thank you for the discussion. Please reopen if you have any additional comments or questions.
from promises.
Related Issues (20)
- Sometimes Post Request Timeout HOT 6
- FBLPromises crashing HOT 2
- Question. Is it possible to change the delay time between retrys?
- Bug in iOS 16 DevBeta1 HOT 13
- Extremely slow compile time of Objective-C files
- Contextual type for closure argument list expects 1 argument, which cannot be implicitly ignored
- Objective-C Promises crashes in SwiftUI previews HOT 2
- ios 16 strings convertible to NSError HOT 1
- FBLPromises fails to load building macos flutter app HOT 2
- 'NSInvalidArgumentException', reason: '-[FBLPromise HTTPBody]: unrecognized selector sent to instance HOT 1
- Confused when retry a Promise variable
- type(of: value) is NSError.Type HOT 1
- Bitcode Issue on Xcode 13 when disable it. HOT 1
- Question regarding implementation HOT 3
- Ignore a certain Error and terminate Promise HOT 5
- Please release a new version of promises that includes latest changes for Firebase HOT 4
- Builds including PromisesSwift failing on CI
- Build fails for macOS with Xcode 14.3
- Create releases for new versions HOT 1
- The iOS deployment target 'IPHONEOS_DEPLOYMENT_TARGET' is set to 8.0, but the range of supported deployment target versions is 12.0 to 17.0.99.
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 promises.