【问题标题】:NodeJs Returning data from async fetch on a variable to reuseNodeJs从变量上的异步获取返回数据以重用
【发布时间】:2020-06-15 07:31:34
【问题描述】:

我已经搜索了几个小时(没有成功)关于如何让异步函数返回结果、将其存储在函数外部的变量中并重用该数据。

我的问题是我在一些似乎没有必要的函数中一遍又一遍地获取相同的数据。

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

    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);

例如,最初我运行一个函数来获取数据并创建一个表。

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

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

理想情况下,我只会获取一次数据。

提前致谢!

【问题讨论】:

    标签: node.js postgresql express asynchronous promise


    【解决方案1】:

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

    // 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);
    }());
    

    【讨论】:

    • 您好!所以基本上我应该将所有我想在另一个异步函数中使用获取的结果的函数包装起来。这有意义吗?谢谢!
    • 这一切都是异步的,所以你必须考虑每段代码何时(可能)被执行。最下面的async function()会先被调用,然后会调用readDb(),但是需要等待await fetch()的调用解决,最后才能返回结果,这样你就可以console.log()了。
    • 酷,我想我明白了。我将尝试将底部的异步功能调整为我的用例,看看它是否有效。
    • 您可以使用回调或Promises 做同样的事情,但使用async/await 更容易阅读(如果您需要它们,仍然使用承诺)。
    • 请注意,底部的函数是通过将其定义为 (async function() {}()); 并在末尾添加 () 自动调用的。
    【解决方案2】:

    我们可以在函数外部定义leads,并检查是否需要获取它:

    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 完全正确!
    猜你喜欢
    • 1970-01-01
    • 2015-10-08
    • 2015-04-21
    • 2018-06-30
    • 1970-01-01
    • 1970-01-01
    • 2017-08-08
    • 1970-01-01
    • 2020-07-14
    相关资源
    最近更新 更多