Попытка заставить вещи работать правильно в приложении Blazor Server Side. У меня есть компонент Uploader, но он не вызывает InvokeAsync после разрешения каждого обещания на стороне клиента. Он ожидает загрузки всех изображений, затем вызывает метод C #. Как бы получить его вызывать метод C # после загрузки каждого изображения?

Я знаю, что JavaScript является однопоточным, но также пытался работать с веб-работниками и все еще делает то же самое

Образец репо можно найти здесь https://dev.azure.com/twinnaz/BlazorUploader

Gif того, что происходит.

https://imgur.com/a/aF4AQUf

Он должен иметь возможность параллельно вызывать метод Cyn Async из файла javascript, если мое мышление верно.

2
Wongton 18 Авг 2019 в 01:50

2 ответа

Лучший ответ

Эта проблема связана с 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"  );
    }

Результат:

enter image description here

3
dani herrera 18 Авг 2019 в 10:38
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);
};
0
Wongton 19 Авг 2019 в 00:49