That's really great. I don't like Promises either and your approach is the .NET way. Very clean code and easier to understand and maintain.
Harbs <harbs.li...@gmail.com> escreveu no dia domingo, 24/10/2021 à(s) 11:27: > I just made a commit and I want to give some background: > > I personally strongly dislike Promises. Promises address a need (namely > callback hell), but IMO address it poorly. I find Promises unintuitive and > difficult to use especially when the use case is complex. I have cases > where I have a literally a chain of 35 “then” calls with various catches > mixed in. It’s a nightmare to maintain. > > Here’s my beefs with Promises > 1. You never actually invoke them. You declare a new Promise (or it gets > spawned for you) and it magically happens on its own. I hate magic. > 2. The aforementioned problem makes it very difficult to control *when* > the promise gets invoked. > 3. It’s not very intuitive how/when to resolve and reject promises. > 4. Promises lend themselves to nested function calls which I find very > hard to read. > 5. Running many promises and actually dealing with the results is hard and > cumbersome. > 6. Promise.all can help with the above, but what happens if *some* of them > pass? There’s many different ways that you might want to handle that. > 7. There’s very little control of parallel vs serial running of promises. > 8. What is the result? Hard to know. I’d really like some strongly typed > values to make my life easier. > 9. How do you deal with progress and promises? It only resolves or > rejects. AFAIK, fetch has no way to get progress. How dumb is that? > > On top of all this, I just find I always need to go back to the spec every > time I use promises. I find them *very* unintuitive. > > So I decided to do something about it. My solution is AsyncTasks. > > I created AsyncTasks over two years ago and I’ve been using them in my app > since then. (My use case was pretty specific to my needs.) I had on my > to-do list to add some concrete AsyncTasks to Royale for this whole time > and I was finally inspired to follow through… > > I just created three Async classes in Network for HTTP requests and I > figured now was the time to explain how to use them. ;-) > > Basically: > var task: HttpRequestTask = new HttpRequestTask(); > task.url = “https://foobaz.com/myapi <https://foobaz.com/myapi>”; > task.done(function(taskReturned:HttpRequestTask):void{ > trace(“task is the same and taskReturned: “ + task == > taskReturned);// you get the task back in the done callback > if(task.status == AsyncTask.COMPLETE){ > trace(task.httpResult); > trace(task.httpStatus); > } else {// it failed you can get the status to know why > trace(task.httpStatus); > } > }); > // you need to run it or nothing happens... > task.run(); > > That’s a single task. You can also pass an array of tasks (of all types) > into a CompoundAsyncTask or a SequentialAsyncTask. > > CompoundAsyncTasks run all the requests in parallel. You can failEarly if > you want it to complete when the first one errors. Otherwise you have the > list of all the tasks when it’s done and you can loop through them to do > whatever you want with the results. You can also get the completed and > failed tasks separately. > > SequentialAsyncTask is the same, but it runs each task when the previous > one finished. It passes the previous task into the next one’s run method so > you can chain results. > > I added tasks for upload and download progress. > > I’d like to create one for multipart and File upload as well, but not > today… > > IMO this architecture addresses every one of my pet peeves. I find them > easy to use and reason about. I also just updated them to make it pretty > difficult to create memory leaks while using them. > > I hope you like it as much as me… ;-) > > Harbs