当我从客户端发出SignalR hub方法调用时,我可以注册到done
和fail
promise-callbacks。但是,第三个是实用的,progress
。当集线器操作需要很长时间时,我能以某种方式利用它来发送某种中间数据吗?我希望保留真实操作结果的done
回调,这样我就可以拥有干净的客户端代码。
我知道我可以调用我想传递中间数据的任何客户端方法,但这有点不同,因为它与原始服务器调用无关。我希望绑定到服务器调用,你就会理解为什么。
我有一个运行几分钟的服务器操作,我想在调用后立即将ID传递给客户端,所以客户端可以取消它,例如。
这是一个划痕。
...
public async Task<LongOperationResult> SomeLongOperation(string someInputData) {
var id = Guid.NewGuid().ToString("N");
// store the id in a static concurrent dictionary, create a cancellation token source, etc.
// send the id here to caller's progress callback somehow
return await Task.Run(() => {
// do the long processing operation
return new LongOperationResult() { ... };
});
}
...
在客户端
hub.server
.someLongOperation(myInput)
.progress(function(id) {
// do something, bind click event of a Cancel button, etc.
})
.done(function(result) {
// do something with result of type LongOperationResult
});
我的真实场景有点复杂,允许同时运行多个任务,等等。这只是我正在寻找的例子。