Javascript 承诺中的NodeJs PowerShell脚本

Javascript 承诺中的NodeJs PowerShell脚本,javascript,html,node.js,ajax,Javascript,Html,Node.js,Ajax,我一直在尝试使用setImmediate执行PowerShell脚本,如下所示: 网页上有两个按钮;一个按钮(CallScript)用于在/ExecutePS发送post请求,另一个按钮(GetData)用于在执行PS脚本时获取数据 app.post('/ExecutePS', async function computeWSetImmediate(req, res) { console.log('Fetching Users...'); var ThisSelTNow = req.

我一直在尝试使用setImmediate执行PowerShell脚本,如下所示:

网页上有两个按钮;一个按钮(CallScript)用于在/ExecutePS发送post请求,另一个按钮(GetData)用于在执行PS脚本时获取数据

app.post('/ExecutePS', async function computeWSetImmediate(req, res) {  
  console.log('Fetching Users...');
  var ThisSelTNow = req.body.ThisT;
  console.log(ThisSelTNow);

  function setImmediatePromise() {
    return new Promise((resolve) => {
      setImmediate(() => resolve());
    });
  }

  ps.addCommand("./public/NodeJSFetch.PS1", [ {
    name: 'SelectedTenantNow', value: ThisSelT
  } ])  
  ps.invoke().then(output =>
    {      
      response.send({message:"All users were fetched"});
    });
  await setImmediatePromise(); 
});
当我点击“CallScript”按钮时,脚本执行,但事件循环挂起,点击“GetData”什么也不做

如果我执行下面的代码,我可以通过点击“GetData”按钮来获取数据。换句话说,事件循环能够监听事件

app.post('/ExecutePS', async function computeWSetImmediate(req, res) {  
  console.log('Fetching Users...');
  var ThisSelTNow = req.body.ThisT;
  console.log(ThisSelTNow);

  function setImmediatePromise() {
    return new Promise((resolve) => {
      setImmediate(() => resolve());
    });
  }

  for (let i = 0; i < 10000000000; i++) {    
    console.log(i);    
    await setImmediatePromise()
  }
});
app.post('/ExecutePS',异步函数computeWSetImmediate(req,res){
log('Fetching Users…');
var ThisSelTNow=req.body.ThisT;
console.log(ThisSelTNow);
函数setImmediatePromise(){
返回新承诺((解决)=>{
setImmediate(()=>resolve());
});
}
对于(设i=0;i<1000000000;i++){
控制台日志(i);
等待setImmediatePromise()
}
});

非常感谢您的帮助。谢谢。

您有什么证据证明
/ExecutePS
路由正在阻止事件循环执行任何其他操作?仅仅因为按下GetData按钮在客户端中看不到结果并不能证明您的问题是服务器上的事件循环阻塞在函数的末尾,您实际在做什么?在我看来,它似乎什么也没做,因为函数中没有任何代码会影响
wait
,也没有任何代码使用从
async
函数返回的承诺。浏览器挂起可能与服务器事件循环被挂起非常不同。这就是为什么我问您如何知道服务器事件循环被卡住的原因,因为我在第一个
/ExecutePS
路由中没有看到阻止事件循环的任何内容,除非
ps.addCommand()
ps.invoke()
正在这样做。如果是,则
wait setImmediatePromise()
根本帮不上忙。到目前为止,你在问题中的断言对我来说毫无意义,所以我的直觉告诉我,你对问题所在做出了一些错误的假设。这就是为什么我要问你如何知道你断言了什么。你的第二个
/ExecutePS
路由中没有ps的东西,所以第二个代码块除了一个路由处理程序之外没有其他的帮助,它只调用
setImmediatePromise()
不会阻止事件循环。但是,您的第一个代码块中有其他内容。在我看来,如果事件循环真的被阻塞了,那么是
ps
方法在执行它,这就是需要修复的地方。PowerShell脚本需要在一个非阻塞的child_进程中运行,该进程独立于您尝试执行的其他操作。您是否正在使用
节点powershell
模块?我试着看看它的代码,看看它在做什么,但这并不简单。如果它阻塞了您的事件循环,您就不会用
setImmediate()
实验来修复它。它必须在powershell模块内部或在您如何配置它时进行修复。