Node.js NodeJs从异步获取返回变量上的数据以供重用

Node.js NodeJs从异步获取返回变量上的数据以供重用,node.js,postgresql,express,asynchronous,promise,Node.js,Postgresql,Express,Asynchronous,Promise,我已经四处搜索了几个小时,但没有成功地找到如何让异步函数返回结果、将其存储在函数外部的变量中并重用该数据的方法 我的问题是,我在我的一些函数中反复获取相同的数据,这似乎是不必要的 基本上这就是我想要的,而现在它正在回报一个承诺 let leads; try { var result = await fetch('http://localhost:3000/lds'); leads = await result.json(); ret

我已经四处搜索了几个小时,但没有成功地找到如何让异步函数返回结果、将其存储在函数外部的变量中并重用该数据的方法

我的问题是,我在我的一些函数中反复获取相同的数据,这似乎是不必要的

基本上这就是我想要的,而现在它正在回报一个承诺

    let leads;
    try {
        var result = await fetch('http://localhost:3000/lds');
        leads = await result.json();
        return leads;

    } catch (e) {
        // handle error
        console.error(e)
    }
}

var results = readDb();
console.log(results);
例如,最初我运行一个函数获取数据并创建一个表

其次,我运行另一个函数来获取相同的数据以创建分页按钮

第三,我运行另一个函数,再次获取相同的数据,并侦听分页按钮,单击以显示相应页码的数据

理想情况下,我只提取一次数据

提前谢谢

由于您使用的是async/await,因此需要等待该值,但它仅在异步函数中可用。加载变量后,可以在函数外部重用该变量来存储该值

// reuse leads variable
let leads;

// async function to populate/return leads
async function readDb() {
  // only populate if it is undefined
  if (typeof leads === 'undefined') {
    const result = await fetch('http://localhost:3000/lds');
    leads = await result.json();
  }
  // return just loaded or referenced value
  return leads;
}

// call the function asynchronously 
(async function(){
  // await the results here inside an async function
  const results = await readDb();
  console.log(results);
}());
我们可以在函数外部定义Lead,并检查是否需要获取它:

let leads;
const getLeads = async function() {

    try {
        if (!leads) { // fetch leads only they weren't already loaded
            const result = await fetch('http://localhost:3000/lds');
            leads = await result.json();
        }
        return leads;

    } catch (e) {
        // handle error
        console.error(e)
    }
}

你好@alfasin,所以我试着运行getLeads函数并记录leads变量,结果我没有定义。你能澄清一下如何使用这种方法吗?谢谢:@JerónimoLlacay我需要查看您的代码以了解哪里出错了我想我理解了您为什么在外部定义leads变量。所以,如果我在下面的异步函数上运行getLeads,它就会知道它已经被获取了,对吗?@JerónimoLlacay!你好因此,基本上,我应该将我希望使用的所有函数包装到另一个异步函数中。这有意义吗?谢谢它都是异步的,所以您必须考虑每段代码可能何时执行。首先调用底部的异步函数,然后调用readDb,但需要等待调用等待fetch解决,然后才能最终返回结果,以便您可以对其进行console.log。很好,我想我已经得到了。我将尝试根据我的用例调整底部的异步函数,看看它是否有效。您可以对回调或承诺执行相同的操作,但使用async/await更容易阅读,如果需要,仍然使用承诺。请注意,底部的函数是通过将其定义为异步函数{}自动调用的;最后是最后一个。