동일한 문제가 발생했습니다.
못생긴 해결 방법은 두 IJavascriptCallback
인수 (resolve
및 reject
)를 async void
에 방법을 엉망으로하고 받아들이는 것 같다. 예를 들어
: 자바 스크립트에서 다음
browser.RegisterAsyncJsObject("myCalculator", new MyCalculator());
:
function doThingAsync(name) {
return new Promise(function (resolve, reject) {
window.myCalculator.calcAsync(name, resolve, reject);
});
}
var result = await doThingAsync("foo")
당신이 좋아하는 무언가로 밖으로 패턴을 뽑을 수 :
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());
}
}
}
는 등록
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")