Моя async
реализация метода повтора:
public static async Task<T> DoAsync<T>(Func<dynamic> action, TimeSpan retryInterval, int retryCount = 3)
{
var exceptions = new List<Exception>();
for (int retry = 0; retry < retryCount; retry++)
{
try
{
return await action().ConfigureAwait(false);
}
catch (Exception ex)
{
exceptions.Add(ex);
}
await Task.Delay(retryInterval).ConfigureAwait(false);
}
throw new AggregateException(exceptions);
}
Ключевые моменты: вместо этого я использовал .ConfigureAwait(false);
и Func<dynamic>
Func<T>
Вы получаете ошибку, потому что ваш WASM имеет операторы импорта, в то время как ваш вызов instantiateStreaming не отправляет importObject.
Но основной способ использования WASM из Javascript намного проще, чем: просто определите функцию в WASM, которую вы можете вызывать из JS, а затем, например, выполните «выборку» из JS («add.wasm») :
(module
(type $t0 (func (param i32 i32) (result i32)))
(func $add (type $t0) (param $p0 i32) (param $p1 i32) (result i32)
get_local $p0
get_local $p1
i32.add)
(export "add" (func $add)))
А затем вызвать его из Javascript:
const wasmInstanceFromFile = await WebAssembly.instantiateStreaming(await fetch('add.wasm'));
let sum = wasmInstanceFromFile.instance.exports.add(1,2);