【发布时间】:2021-11-06 05:06:39
【问题描述】:
当用户离开 Blazor WebAssembly 中的页面时,我试图取消长时间运行的 JavaScript 进程。我在页面上实现 IDisposable 并在调用 JavaScript 函数时传入一个令牌。
在 Dispose 方法上,我在令牌上调用 .Cancel() 和 .Dispose()。但是,如果我启动该功能并导航到另一个页面,该过程仍会继续。
这里有一些示例代码来显示我遇到的问题。这是使用基本 Blazor WebAssembly 模板。
如果您打开控制台窗口,您会看到,一旦您到达“计数器”页面,我会在 OnInitializedAsync() 上调用 JavaScript 方法,然后如果您使用菜单导航到另一个页面,例如“主页”并等待被调用的超时仍然会打印到控制台日志。
这是我的 JavaScript:
(function () {
testFunctions = {
testFunction1: function (arguments) {
var message = arguments[0];
var timeOutLength = arguments[1];
setTimeout(function () {
console.log(message);
}, timeOutLength);
}
}
})();
还有 Razor 页面:
@page "/counter"
@inject IJSRuntime _jsRuntime
@implements IDisposable
@code {
private System.Threading.CancellationTokenSource jsCancellationToken = new System.Threading.CancellationTokenSource();
protected override async Task OnInitializedAsync()
{
var args = new List<object>();
args.Add("Hello!");
args.Add(10000);
var uploadResult = await _jsRuntime.InvokeAsync<string>("testFunctions.testFunction1", jsCancellationToken.Token, args);
}
public void Dispose()
{
jsCancellationToken.Cancel();
jsCancellationToken.Dispose();
}
}
我的问题是,当我处理页面时,如何才能完全终止此 JavaScript 进程继续运行?
【问题讨论】:
-
我认为您需要调用 clearTimeout,这意味着您需要存储从 setTimeout 返回的值 - 然后调用另一个函数
cancelTestFunction1来取消。 -
A
CancellationToken不会中止呼叫。它用于协作取消 - 向另一种方法发出取消信号。由方法来优雅地停止和退出。在这种情况下,取消将取消对InvokeAsync的等待,但没有什么可以告诉 JavaScript 方法它需要退出 -
@INNVTV,按照 Magoo 先生的建议,使用 clearTimeout 函数。实现代码的最简单方法是使用 DotNetObjectReference 对象。
-
@PanagiotisKanavos 如何从我的 JavaScript 访问 CancellationToken?它似乎没有作为参数传入。
-
@enet 我仅使用 setTimeout() 作为示例运行过程。在现实世界的场景中(在我的情况下,使用块上传大文件)我们可能没有方法。
标签: javascript .net asp.net-core blazor blazor-webassembly