Javascript 如何在nodejs中加速函数调用

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:

当某些数据发布到数据库时,我将创建一个到后端的get请求。因此,为了在触发get请求之前等待post请求完成,我实现了如下等待逻辑,
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)