Suj*_*dke 6 javascript asynchronous google-apps-script progress-bar
我正在尝试编写一个具有客户端和服务器端组件的Google Apps脚本。客户端组件显示进度条。客户端调用服务器端函数(异步调用),这些进程的进度必须显示在客户端进度栏中。现在,我想要的是能够根据来自服务器端功能的反馈来更新客户端进度条。这可能吗?
由于JS异步进行服务器端调用,因此造成了复杂性,因此我无法真正在客户端调用该函数并更新进度栏的循环。
我当然可以将服务器端功能的执行分成多个步骤,从客户端一一调用,每次更新状态栏。但是我想知道是否有更好的解决方案。有没有一种方法可以从服务器端调用客户端函数,并根据传递的参数来更新进度条?还是有一种方法可以从服务器端访问客户端进度栏对象并对其进行修改?
我处理此问题的方法是让中间人(现在向Romain Vialard喊出一个主意)来处理进度:Firebase
HTML /客户端可以连接到您的Firebase帐户(它们是免费的!),并“监视”更改。
客户端代码可以随着代码的进行而更新数据库-这些更改会立即通过Firebase反馈到HTML页面。这样,您可以更新进度条。
罗曼(Romain)在这里有一个小例子/说明
我使用的代码:
//Connect to firebase
var fb = new Firebase("https://YOUR_DATABASE.firebaseio.com/");
//Grab the 'child' holding the progress info
var ref = fb.child('Progress');
//When the value changes
ref.on("value", function(data) {
if (data.val()) {
var perc = data.val() * 100;
document.getElementById("load").innerHTML = "<div class='determinate' style='width:" + perc + "%\'></div>";
}
});
Run Code Online (Sandbox Code Playgroud)
在客户端,我使用Firebase库更新进度:
var fb = FirebaseApp.getDatabaseByUrl("https://YOUR_DATABASE..firebaseio.com/");
var data = { "Progress": .25};
fb.updateData("/",data);
Run Code Online (Sandbox Code Playgroud)
我建议您将这两个问题分开,而不是将工作请求和进度更新捆绑在一起。
在服务器端,根据客户端请求执行工作的函数应该更新状态存储;例如,这可以是 ScriptProperty。工作职能在完成工作之前不需要响应客户。服务器还应该有一个可以被客户端调用的函数来简单地报告当前的进度。
当客户端第一次调用服务器请求工作时,它还应该调用进度报告器。(大概,第一次调用将得到 的结果0%。)onSuccess状态调用的处理程序可以更新您用来表示进度的任何视觉效果,然后再次调用服务器的进度报告器,将其自身作为成功处理程序。当然,这应该延迟完成。
当进度达到100%或工作完成时,可以关闭客户端的进度检查器。