Javascript 如何在nodejs中加速函数调用
当某些数据发布到数据库时,我将创建一个到后端的get请求。因此,为了在触发get请求之前等待post请求完成,我实现了如下等待逻辑,Javascript 如何在nodejs中加速函数调用,javascript,node.js,get,axios,backend,Javascript,Node.js,Get,Axios,Backend,当某些数据发布到数据库时,我将创建一个到后端的get请求。因此,为了在触发get请求之前等待post请求完成,我实现了如下等待逻辑,postArray.called=true const postArray = async (arr) => { const movie = { name: searchTerm, result: arr } try { await axios({ method:
postArray.called=true
const postArray = async (arr) => {
const movie = {
name: searchTerm,
result: arr
}
try {
await axios({
method: 'post',
url: url,
data: result,
headers:{
"Content-Type":"application/json",
"Accept":"application/json"
}
})
} catch (error) {
console.log(error)
}
postArray.called = true
}
为了让get请求等待post请求,我使用了类似这样的if条件
app.get("/getNewList", (req, res)=>{
if(postArray.called){
process.nextTick(()=>{
axios.get('http://localhost:3001/List')
.then(response => res.send(response.data))
.catch(error => res.send(error))
})
}
})
问题是,在post请求被调用后的2到3分钟内,此get请求没有得到调用。我需要一种方法来加速这个函数调用,这样它就不会完全减慢我的应用程序
有时,请求超时,我得到一个超时错误
有没有别的办法让这更快
////编辑////
我被告知使用if(postArray.called)
与让get请求等待不同,所以我尝试了其他方法
async function getData(props){
let Result = []
let fetchAgain = await axios.get('/getNewList')
Result = fetchAgain.data.find(x => x.name.toLowerCase() === props.toLowerCase()).result
showResult(Result)
}
async function fetchPost(props){
axios.post(`/${props}`)
.then((res) =>{
if(res.status === 200){
getData(props)
}
})
}
这是前端发出的新请求。我声明了一个函数来调用get请求,然后将其传递给post请求的。然后部分。
这仍然不起作用。请记住,如果(postArray.called)
已从后端的get请求中删除
fetchPost
函数用于向我的后端发送数据,然后后端查询两个外部API:
function newFetch(a){
const promises = [
Fetch(`https://externalapi1?=${a}.com`,
Fetch(`https://externalapi2?=${a}.com`,]
Promise.all(promises)
.then(values =>{
const result = values.filter(o=>Object.values(o).every(v=>v) && Object.entries(o).length);
postArray(result)}
.catch(err => console.log(err))
}
这是调用postArray函数的地方。然后,我打算从后端获取这些数据以呈现给我的客户机。使用上述两种失败的方法
///结束编辑///
/////这就是newFetch被称为////
app.post("/:endpoint([\\/\\w\\ ]*)", async (req, res) =>{
newFetchPromise = await newFetch(req.params.endpoint).catch(err => {
newFetchPromise = null
})
})
假设这是每服务器操作,而不是每用户操作
首先,修复newFetch()
function newFetch(a) {
const promises = [
Fetch(`https://externalapi1?=${a}.com`),
Fetch(`https://externalapi2?=${a}.com`),
];
return Promise.all(promises).then(values => {
const result = values.filter(o => Object.values(o).every(v => v) && Object.entries(o).length);
return postArray(result);
}).catch(err => {
// log and rethrow so caller sees the error
console.log(err);
throw err;
});
}
然后,无论在哪里调用newFetch()
,都需要将返回的承诺保存到模块级变量中:
// module level variable
let newFetchPromise;
// wherever you call newFetch()
newFetchPromise = newFetch(...).catch(err => {
newFetchPromise = null;
});
然后,在路由处理程序中,您可以等待该模块级承诺:
app.get("/getNewList", (req, res)=>{
if (newFetchPromise) {
// wait for newFetchPromise
// this will work whether newFetchPromise has already finished or is still
// processing
newFetchPromise.then(() => {
return axios.get('http://localhost:3001/List');
}).then(response => {
res.send(response.data);
}).catch(err => {
// maybe want to set an error status here?
res.send(err);
});
} else {
// have to send some sort of response here if there was no newFetchPromise
console.log("no newFetchPromise to wait for");
res.sendStatus(500);
}
});
当再次调用newFetch()
时,它只会将模块级的newFetchPromise更新为最新的,因此任何新的/getNewList
请求将始终等待最新的承诺,而之前的任何请求都将等待它们最初等待的承诺。不清楚您的总体问题是什么。相反,您询问的是一些尝试解决方案的实现细节(这似乎是一个有缺陷的方向)。您能否备份并描述您试图解决的总体问题,描述传入的请求以及这些请求应该做什么。仅供参考,如果(postArray.called)
没有等待完成。它只是检查一个标志,如果该标志不正确,则执行另一个代码分支。代码中没有等待。if(postArray,called)
会检查post请求是否已被调用,并阻止get函数在此之前运行。这确实是一个实现问题,我只是不知道如何以不同的方式完成它。它可以工作,但是发出get请求需要很长时间,我需要一些方法来加快这个过程,如果这是你的整个app.get(“/getNewList”,…)
处理程序,那么如果postArray.called
不是真的,那么get请求永远不会返回任何东西。我只是让客户永远挂着等待响应,直到它最终超时。这不需要等待任何事情。post请求每次都会被调用,但是你能建议其他方法来实现这一点吗?@Imhotep-我不确定我是否完全理解谁调用了谁,但希望您可以使用这个示例来了解如何创建模块级承诺,以及请求处理程序如何等待该承诺完成,然后再继续其剩余工作。不管承诺已经解决还是还没有解决,这都会起作用。首先,我要感谢你为此付出的努力,我实施了你的解决方案,但出现了这个错误,我一直试图自己解决,但是我不能| |错误:unhandledPromisejectionWarning:TypeError:将循环结构转换为JSON
它起源于调用newFetch
的地方app.post(“/:endpoint([\\/\\w\\]*)”,async(req,res)=>{newFetchPromise=wait newFetch(req.params.endpoint).catch(err=>{newFetchPromise=null;})
我声明为一个模块变量,就像你说的那样,现在我意识到它的格式不正确,可能会让人困惑。我将粘贴在原始问题的底部。它是从前端post
请求调用newFetch
的函数。该错误源于尝试将某些内容转换为包含循环引用的JSON。可能来自res.send(response.data)代码>。另外,newFetchPromise=wait newFetch(…)
是错误的。卸下等待
。您希望newFetchPromise
立即成为承诺,而不是等到承诺得到解决。我删除了wait
,但它是一样的。这是完整的错误语句,源于我前面在process中指出的同一点。_tickCallback(internal/process/next_tick.js:68:7)(node:1404)unhandledPromisejectionWarning:Unhandled Promisejection拒绝。此错误源于在没有catch块的异步函数中抛出,或者拒绝未使用.catch()处理的承诺。(拒绝id:4)