Blazor JsInterop 在每个承诺解决后调用
Blazor JsInterop Invoke after each promise resolves
正在尝试让 Blazor 服务器端应用程序正常运行。我有一个上传器组件,但在客户端解决每个承诺后它不会 InvokeAsync 。它等待所有图像加载,然后调用 C# 方法。我如何让它在每个图像加载后调用 C# 方法?
我知道 JavaScript 是单线程的,但也尝试过使用 web workers 并且仍然做同样的事情。
可以在此处找到示例存储库
https://dev.azure.com/twinnaz/BlazorUploader
动态图。
如果我的想法是正确的,它应该能够从 javascript 文件中并行调用 C# 方法 Async。
此问题与 Blazor 和 JS 有关。在 JS 上,您不是在等待 GenerateImageData
。
您应该改用现代 for … of
循环,其中 await
将按预期工作:
GetFileInputFiles = async (instance, fileInput) => {
var files = Array.from(fileInput.files);
for (const image of files) {
var imagedata = await readUploadedFileAsText(image);
console.log("sending");
_ = await instance.invokeMethodAsync('GenerateImageData', imagedata);
console.log("sent");
};
};
在 Blazor 上,我建议您将 GenerateImageData
重写为:
[JSInvokable]
public async Task GenerateImageData(string data)
{
System.Console.WriteLine( "Receiving" );
ImageBase64.Add(data);
await Task.Delay(1);
StateHasChanged();
System.Console.WriteLine( "Received" );
}
结果:
- 关于 JS 问题的更多详细信息:
- 关于 Blazor 问题的更多详细信息:
GeneratePreviewImages = async (dotNet, fileInput) => {
const files = Array.from(fileInput.files);
const imageSrcs = files.map(file => getPreviewImageSrc(file));
loop(imageSrcs, dotNet);
};
const loop = async (arr, dotNet) => {
for await (const src of arr) {
console.log(src);
dotNet.invokeMethodAsync('GenerateImageData', src);
}
};
const getPreviewImageSrc = async (file) => {
return URL.createObjectURL(file);
};
正在尝试让 Blazor 服务器端应用程序正常运行。我有一个上传器组件,但在客户端解决每个承诺后它不会 InvokeAsync 。它等待所有图像加载,然后调用 C# 方法。我如何让它在每个图像加载后调用 C# 方法?
我知道 JavaScript 是单线程的,但也尝试过使用 web workers 并且仍然做同样的事情。
可以在此处找到示例存储库 https://dev.azure.com/twinnaz/BlazorUploader
动态图。
如果我的想法是正确的,它应该能够从 javascript 文件中并行调用 C# 方法 Async。
此问题与 Blazor 和 JS 有关。在 JS 上,您不是在等待 GenerateImageData
。
您应该改用现代 for … of
循环,其中 await
将按预期工作:
GetFileInputFiles = async (instance, fileInput) => {
var files = Array.from(fileInput.files);
for (const image of files) {
var imagedata = await readUploadedFileAsText(image);
console.log("sending");
_ = await instance.invokeMethodAsync('GenerateImageData', imagedata);
console.log("sent");
};
};
在 Blazor 上,我建议您将 GenerateImageData
重写为:
[JSInvokable]
public async Task GenerateImageData(string data)
{
System.Console.WriteLine( "Receiving" );
ImageBase64.Add(data);
await Task.Delay(1);
StateHasChanged();
System.Console.WriteLine( "Received" );
}
结果:
- 关于 JS 问题的更多详细信息:
- 关于 Blazor 问题的更多详细信息:
GeneratePreviewImages = async (dotNet, fileInput) => {
const files = Array.from(fileInput.files);
const imageSrcs = files.map(file => getPreviewImageSrc(file));
loop(imageSrcs, dotNet);
};
const loop = async (arr, dotNet) => {
for await (const src of arr) {
console.log(src);
dotNet.invokeMethodAsync('GenerateImageData', src);
}
};
const getPreviewImageSrc = async (file) => {
return URL.createObjectURL(file);
};