通知浏览器UI有关对服务器的SignalR请求

时间:2017-03-17 14:24:20

标签: signalr signalr.client

我在浏览器中使用SignalR。一些请求(在服务器上调用函数)很长,我想显示spinner / loading-bar。

当这个函数启动并返回时,我可以以某种方式挂钩事件。

1 个答案:

答案 0 :(得分:0)

我想弄清楚你的意思 - 我想基本上你想要一些方法来挂钩一个调用的开始和一个调用的结束(加载和卸载一个微调器)?

我用两种不同的方式完成了这项工作 - 首先是一次性(第一个例子),然后是更系统性的(第二个例子)。希望其中一个是您所需要的。

$.connection.myHub.server.hubMethod().done(function () {
                                //called on success
                            }).fail(function (e) {
                                //called on failure - I don't recommend reading e
                            }).always(function() {
                                //called regardless
                                spinner.close();
});
spinner.open(); // must be triggerd AFTER call incase exception thrown (due to connection not being up yet)

如果您不喜欢这样 - 也许是因为您在数百个不同的代码段中调用了hub方法,那么还有其他一些技巧会更复杂一些。让我们看看:

function SetupSpinnerOnCallToSignalrMethod(hubServer, method, spinnerStartCallback, spinnerEndCallback) {
    var prevFunc = hubServer[method];
    hubServer[method] = function () {
        var ret = prevFunc.apply(this, arguments);
        spinnerStartCallback(); // must be triggerd AFTER call incase exception thrown (due to connection not being up yet)
        ret.always(function() {
            spinnerEndCallback();
        });
        return ret;
    };
}

//then call this for each method
SetupSpinnerOnCallToSignalrMethod($.connection.myHub.server,
                                  "hubMethod",
                                  function() { spinner.open(); },
                                  function() { spinner.close(); }
);

//the server call should then work exactly as before, but the spinner open and close calls are invoked each time.