RestClient icon indicating copy to clipboard operation
RestClient copied to clipboard

Update promises to be awaitable using `async`/`await`

Open matronator opened this issue 2 years ago • 6 comments

Promises are so ugly, especially when you have to chain multiple .Then() blocks. So I tried to await the promise instead, but it won't compile because they're not awaitable.

Now this might be just a misunderstanding of C# promises, coming from JavaScript ESNext, but isn't async/await basically the same thing as promises, but with much cleaner and nicer syntax?

As in, doesn't this code

RestClient.Get("/api/something")
.Then(response => {
    Debug.Log(response.Text);
});

do the exact same thing as this one?

var response = await RestClient.Get("/api/something");
Debug.Log(response.Text);

Or at least it would if the promise could be awaited. Which would be awesome!

matronator avatar May 14 '22 18:05 matronator

Hello dude, thanks for reporting this issue

This plugin supports multiple versions of Unity, since .NET Framework 3.5 and async/await syntax is not supported in previous versions, that's why we are using RSG.Promise for management of async operations, any ideas or pull requests to support async/await are really welcome! ❤️

jdnichollsc avatar May 30 '22 01:05 jdnichollsc

Shameless plug - probably a non-starter, but I built a Promise library that supports async/await, is much more efficient than RSG (on par with UniTask), and supports old versions of Unity also. I say non-starter because switching from RSG to Proto.Promises would likely break consumers of this library, but maybe worth taking a look (maybe for a v3 update?). :smile:

https://github.com/timcassell/ProtoPromise

timcassell avatar Aug 04 '22 13:08 timcassell

@timcassell congrats mate, that's amazing! 💯

jdnichollsc avatar Aug 04 '22 14:08 jdnichollsc

@jdnichollsc Does that mean you're interested in making the switch? I'd be happy to help with the integration if you want.

As a bonus, the Promise source code wouldn't need to be included in the package like you did with RSG, since ProtoPromise is on the asset store and nuget, so it could just be listed as a dependency instead.

timcassell avatar Aug 08 '22 15:08 timcassell

@timcassell sure thing, any pull request is really appreciated, thanks in advance for your contribution! ❤️

jdnichollsc avatar Sep 01 '22 13:09 jdnichollsc

@jdnichollsc Cool. Before I start, I want to understand how the nuget package works. Are you including the Unity dlls in the package? How is the nuget package consumed? Does it work outside of Unity? What differences are there between the nuget package and unity package?

[Edit] I ask because I have some Unity-specific helpers in ProtoPromise that are not included in the nuget package, only in the unity package, so that it can work on other frameworks. I may have to package those helpers as a separate nuget package, depending how your nuget package works.

[Edit2] I went ahead and made that separate package anyway, and updated the core package to work in old Unity versions (notably IL2CPP that had a lot of problems that I had to work around prior to Unity 2021.2).

timcassell avatar Sep 01 '22 20:09 timcassell