我想读使用JSInterop
.The问题提供的Blazor
某些文件的是,即使在.C#
我等待的方法,现在看来,这并不await
it.Thus我不能检索由js
提供的结果。
C#
<input name="start" type="file" onchange="@(async(x)=>await OnChangeS(x))" />
@functions{
private const string S = "start";
public async Task OnChangeS(UIChangeEventArgs ev) {
var str = await JSRuntime.Current.InvokeAsync<string>("methods.readFile", S);
Console.WriteLine("From blazor data is:" + (string.IsNullOrEmpty(str) ? "empty" : str));
}
}
JS
window.methods = {
readFile: function (fileName) {
let reader = new FileReader();
var file = document.querySelector('input[type=file ][name=' + fileName + ']').files[0];
var data = null;
reader.onload = () => {
data = reader.result;
console.log("from load data is"+data);
};
reader.onloadend = () => { console.log("from loadend data is"+data);return data };
reader.readAsText(file);
}
}
OUTPUT:
给定样本json
文件:{ "name":"adita","age":33}
这是我的输出顺序:
WASM: Blazor S:empty
Fread.js:11 from load data is: {
"name":"adita",
"age":33
}
Fread.js:14 from loadend data is: {
"name":"adita",
"age":33
}
所以我的问题是,为什么在方法不受Blazor
期待?
我已经通过我的包裹导致FileReader
在Promise
.I实际上并没有发送任何追溯到@Kirk沃尔指出,解决它。
window.methods = {
readFile: function (fileName) {
let reader = new FileReader();
return new Promise((resolve, reject) => {
var file = document.querySelector('input[type=file ][name=' + fileName + ']').files[0];
reader.onerror = () => { reader.abort(); reject("Error parsing file"); };
reader.onload = () => {
var data = reader.result;
console.log("from load data is: " + data);
resolve(data);
};
reader.readAsText(file);
});
}
}
试试这个:更改onchange="@(async(x)=>await OnChangeS(x))"
要onchange="@OnChangeS"
注意:即使这个变化不会解决这个问题,你还是应该像这样使用。