express js 具有同步功能,冻结网页

问题描述 投票:0回答:1

我正在用express构建一个应用程序,我意识到我的想法是错误的

Promises

这是

module.js

module.exports = function(arguments){
      for(let k =1; k < something.length; k++){
      let options = {
        'url'   : linkConcat + k,
        'proxy' : 'http://' + proxArray[ii],
        'tunnel': true
      }

      promisesFor209.push(
        new Promise((resolve, reject) => {

          console.log('start');
          request(options, function(error, response, body){ 
               //do stuff with request (resolve or reject)
          })
        })
       )

   }
    return Promise.all(promisesFor209).then(() => {
        return someData;//dostuff
    })
}

这是

main.js

app.post('/mypostPath', async function(req, res) {
    try{
        var linksArrayLink = await require('./module.js')(params)
        console.log('await finished');
        //do stuff with linksArrayLink
        res.send('success');
    }catch(e){
         console.log(e); res.send('error');
    }
})

所以它使整个网站冻结...当我收到请求时,它会立即在终端上记录所有 for 循环实例的

start
,然后冻结应用程序,直到完成所有请求。有时,请求可能需要长达 5 分钟的时间。我不知道代理或请求是否很慢,但它锁定了整个网站,这是一个糟糕的设计。

在不锁定网站的情况下执行此操作的更好代码是什么?我仍然想等待所有响应返回,以便稍后处理数据。但是如何在不让整个网站冻结的情况下以安全的方式实现它,就像我使用

Promises
所做的那样?

编辑:

或者是否可以在

res.send()
内执行
module.js
?这样也许我可以摆脱承诺结构,为所有请求创建一个计数器,当达到计数器时,
return
res.send()

据我了解,我永远不应该在快速应用程序中使用

await
(特别是对于需要时间的操作),但是有其他选择吗?

javascript node.js express promise
1个回答
0
投票

答案是,您可以使用Pooling或WS协议来实现逻辑,并在完成时收到通知。

对于这两种方法,您都应该运行作业后台!

  1. 示例 Pooling 你应该保存当前作业的 id,前端只会收到作业 id,并且可以每 5 秒请求一次以获取当前作业状态的结果
  2. 示例 WS 只需保持连接,您就可以在工作完成时收到通知
© www.soinside.com 2019 - 2024. All rights reserved.