在node.js API中,如何在不冻结浏览器的情况下执行必须同步的任务?

时间:2017-09-27 20:45:42

标签: javascript node.js xmlhttprequest

首先,我正在努力实现这一目标:

我正在尝试将文件副本写入服务器阵列。在这些副本之前和之后,必须按特定顺序完成几个步骤(例如,停止IIS,备份和清除文件夹,运行bat文件等),因此它们不是单个操作。

为了使这个变得非常简单,我在node.js中编写了一个API,它执行简单的任务,如复制文件和文件夹,删除文件夹等。然后我使用快速生成器和使用javascript XMLHhttpRequests的Pug在node.js中编写了一个前端。根据我需要做的事情向API发送命令。我已经编写并运行了API以及前端。现在回答问题:

如果我的XMLHttpRequest以同步模式运行(例如:xhttp.open(" POST",url,false);)当命令被发送到API以复制文件夹时几分钟复制浏览器冻结。 Chrome会显示" Page Frozen"错误。但是,工作正确完成。

如果我的XMLHttpRequest以异步模式运行(例如:xhttp.open(" POST",url,true);)那么每个命令都会立即发送到API,以便最快的操作完成首先,命令不正常。副本将失败。

我已尝试搜索一种方法,以便从前端javascript发送的每个操作都必须从API返回SUCCESS(或200响应),然后再转到下一个命令,但到目前为止我所有#39;已经看过"只是使用同步"。现在,这就是我正在做的事情。即使有效,这似乎也不是最好的解决方案。是否有更好的方法以不会冻结浏览器的方式执行此操作?

1 个答案:

答案 0 :(得分:0)

我通过编写一个函数来处理请求,设置一个计数器(对于进程的步骤),并在结果的if语句中放置一个switch语句来解决这个问题。它不是我所需要的,但我的解决方案的基础是这个问题的答案:How can I call ajax synchronously without my web page freezing

以下是我所做的事情,以防其他人发现这个问题:

function myFunction (step, params, url) {
   var xhttp = new XMLHttpRequest();
   xhttp.onreadystatechange = function() {
      if (this.readyState == 4 && this.status == 200) {
         switch(step) {
            case 2:
               //url and params are set here, and step 2 is done here
               myFunction(step, params, url);
               break;
            case 3:
               // and so on and so forth
         }
       }
       xhttp.open("POST", url , true);
       xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
       xhttp.send(params);
       step++;
}

//kick off the function
var step = 1;
var url = "my URL to the API with call";
var parameters = "my parameters";
myFunction(step, parameters, url);