blog3000/Blog3000/Client/Utils/PromiseInvoker.cs

66 lines
2.0 KiB
C#

using Microsoft.JSInterop;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace Blog3000.Client.Utils
{
/// <summary>
/// See this for more infos on await promises:
/// https://toddlittlejohn.com/2019/09/15/blazor-javascript-interoperability/
/// </summary>
public static class PromiseInvoker
{
public class PromiseInvokerCallback<T>
{
public readonly TaskCompletionSource<T> tcs = new TaskCompletionSource<T>();
[JSInvokable("SetResult")]
public void SetResult(T o)
{
tcs.SetResult(o);
}
[JSInvokable("SetException")]
public void SetException(string s)
{
tcs.SetException(new InvalidOperationException(s));
}
}
public static async Task<T> InvokePromiseAsync<T>(this IJSRuntime jsRuntime, string funcName, params object[] prms)
{
var cb = new PromiseInvokerCallback<T>();
object[] fp = new object[(prms?.Length ?? 0) + 1];
fp[0] = DotNetObjectReference.Create(cb);
if (prms != null && prms.Length > 0)
{
Array.Copy(prms, 0, fp, 1, prms.Length);
}
_ = jsRuntime.InvokeAsync<T>(funcName, fp);
return await cb.tcs.Task;
//return await InvokePromise<T>(jsRuntime, funcName, prms);
}
public static Task<T> InvokePromise<T>(this IJSRuntime jsRuntime, string funcName, params object[] prms)
{
var cb = new PromiseInvokerCallback<T>();
object[] fp = new object[(prms?.Length ?? 0) + 1];
fp[0] = DotNetObjectReference.Create(cb);
if (prms != null && prms.Length > 0)
{
Array.Copy(prms, 0, fp, 1, prms.Length);
}
jsRuntime.InvokeAsync<T>(funcName, fp);
return cb.tcs.Task;
}
}
}