66 lines
2.0 KiB
C#
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;
|
|
}
|
|
|
|
|
|
}
|
|
}
|