我正在用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
(特别是对于需要时间的操作),但是有其他选择吗?
答案是,您可以使用Pooling或WS协议来实现逻辑,并在完成时收到通知。
对于这两种方法,您都应该运行作业后台!