javascript - 如何让客户端等待服务器完成运行脚本?

标签 javascript

我有一个 Web 客户端,它从用户那里获取参数,并使用简单的 HTML 提交表单向服务器提交表单。

服务器正在运行一个脚本,有时可能需要几分钟才能完成。

当脚本运行超过几分钟时,客户端将重新提交表单,而不是等待第一次提交完成。

如何防止这种情况发生?

示例代码:

提交表格:

<form action="/testCall"> 
   <button type="submit" name="Button">Submit</button>        
</form> 

在服务器上调用命令:

app.get('/testCall', function(req,res){
    var exec = require('child_process').exec;
    var cmd = "myCommand";
    exec(cmd, function callback(error, stdout, stderr){
        res.render('newPage.html', {data: stdout});
    });
});

在这种情况下,myCommand 将运行很长时间,客户端将尝试重新提交表单。

最佳答案

这不是通常的做法,您没有提到的一个问题是用户和后端代码之间的某些层可能会在某个时刻发出超时信号。表单提交确实不应该花费几分钟的时间。

更常见的是在服务器上启动异步任务,使用您在服务器端使用的任何技术(显然是 Node,但我不知道它是如何在 Node 上完成的),并且然后立即返回给用户,向他显示一个没有表单的页面,而是显示工作正在进行中的一些指示。

页面可以时不时地询问服务器任务是否已完成,然后使用脚本的结果刷新自身,或者用户也可以手动执行此操作。

此外,该脚本由 GET 请求启动。请不要这样做,GET 请求并不意味着更改服务器上的任何内容。如果您改用 POST,那么当用户无意中使用 F5 重新提交时,至少浏览器已经显示警告(但用户也会无意中忽略该警告)。

关于javascript - 如何让客户端等待服务器完成运行脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51985783/

相关文章:

javascript - Dan Grossman 的 Bootstrap 日期选择器——回调

javascript - 路由不读取id

javascript - Ajax 在下拉列表中包含数据

javascript - jQuery,可选和文本对齐属性问题

javascript - 如何在VueJs模板中创建临时变量?

javascript - 在 Phaser JS 中设置世界边界

javascript - 在javascript中,是否可以将所有导入简写为一个数组以便导出?

javascript - Vue.js Axios : How to call method from an HTML component passing an argument

javascript - Jquery 事件性能与内存使用情况

javascript - 使用 PHP 和 AJAX 获取页面名称而不是页码