using Microsoft.JSInterop; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace Blog3000.Client.Utils { /// /// See this for more infos on await promises: /// https://toddlittlejohn.com/2019/09/15/blazor-javascript-interoperability/ /// public static class PromiseInvoker { public class PromiseInvokerCallback { public readonly TaskCompletionSource tcs = new TaskCompletionSource(); [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 InvokePromiseAsync(this IJSRuntime jsRuntime, string funcName, params object[] prms) { var cb = new PromiseInvokerCallback(); 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(funcName, fp); return await cb.tcs.Task; //return await InvokePromise(jsRuntime, funcName, prms); } public static Task InvokePromise(this IJSRuntime jsRuntime, string funcName, params object[] prms) { var cb = new PromiseInvokerCallback(); 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(funcName, fp); return cb.tcs.Task; } } }