私は同じ問題に立ちました。
醜い回避策はasync void
にあなたの方法をマングリングと2つのIJavascriptCallback
引数(resolve
とreject
を)受け入れているように見えます。例えば
:
として登録
public class MyCalculator
{
public async void CalcAsync(
string name,
IJavascriptCallback resolve,
IJavascriptCallback reject)
{
try
{
if (resolve.IsDisposed)
return;
int i = /* compute i */;
if (!resolve.IsDisposed)
await resolve.ExecuteAsync(i);
}
catch (Exception e)
{
if (!reject.IsDisposed)
await reject.ExecuteAsync(e.ToString());
}
}
}
:
browser.RegisterAsyncJsObject("myCalculator", new MyCalculator());
次に、あなたのJavaScriptで:
:
function doThingAsync(name) {
return new Promise(function (resolve, reject) {
window.myCalculator.calcAsync(name, resolve, reject);
});
}
var result = await doThingAsync("foo")
次のようなものとしてパターンを引き出すことができます の
private static async Task Promisify(IJavascriptCallback resolve, IJavascriptCallback reject, Func<Task> action)
{
try
{
if (!resolve.IsDisposed)
await action();
if (!resolve.IsDisposed)
await resolve.ExecuteAsync();
}
catch (Exception e)
{
if (!reject.IsDisposed)
await reject.ExecuteAsync(e.ToString());
}
}
private static async Task Promisify<T>(IJavascriptCallback resolve, IJavascriptCallback reject, Func<Task<T>> action)
{
try
{
var result = default(T);
if (!resolve.IsDisposed)
result = await action();
if (!resolve.IsDisposed)
await resolve.ExecuteAsync(result);
}
catch (Exception e)
{
if (!reject.IsDisposed)
await reject.ExecuteAsync(e.ToString());
}
}
バインドされたオブジェクトのメソッドは、似ているでしょう:
public class MyCalculator
{
public async void CalcAsync(
string name,
IJavascriptCallback resolve,
IJavascriptCallback reject)
{
Promisify(resolve, reject,() => /* compute i */);
}
}
を私が使用したい(架空の)APIが似ているでしょう:
public class MyCalculator
{
public async Task<int> CalcAsync(string name) => /* compute i */;
}
そして:
var result = await window.myCalculator.calcAsync("foo")