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

时间:2018-08-23 12:26:24

标签: 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将运行很长时间,客户端将尝试重新提交表单。

2 个答案:

答案 0 :(得分:1)

这不是通常的处理方式,您没有提到的问题是,用户和后端代码之间的某个层有时可能表示超时。提交表单真的不需要花几分钟。

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

每隔一段时间,页面就会询问服务器任务是否已经完成,然后使用脚本的结果刷新自身,或者用户可以手动执行。

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

答案 1 :(得分:1)

尽管RemcoGerlich的建议确实很好,但我的问题是nodeJS阻止了运行时间过长(超过两分钟)的请求

要解决这个问题,您必须在nodeJS后端代码中禁用响应超时:

类似这样的东西:

public SQLiteInvoicedItems(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL(CREATE_TABLE);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL(DROP_TABLE);
    onCreate(db);
}

花点时间找我,希望能对那里的人有所帮助!