节点模块外部的返回值

问题描述 投票:1回答:1

所以我有这个问题,但是我找不到解决方案。我正在使用axios和cheerio抓取我的网站,并且我的网址很大,因此我想使用一种缩短器,我发现npm(node-url-shortener)及其使用非常简单shortUrl.short('https://google.com', function(err, url){ console.log(url); });

但是我不想console.log我想存储该值

  $(
    ".searchListing"
  ).each((index, element) => {
    const name = $(element)
      .children(".media")
      .children("a")
      .text();

    let url = $(element)
      .children(".media")
      .children("a")
      .attr("href");

    shortUrl.short(url, function(err, url) {
      return url;
    });

    console.log(??????);


    prices[index] = { name, url };
  });

如何将缩短的网址存储在shortUrl.short模块外部的数组中?

javascript node.js axios cheerio url-shortener
1个回答
-2
投票

我对使用此特定的API不熟悉,但是在我看来,此功能本质上是异步的。您将值作为第一个参数传递,并且在成功完成某些工作后,可以通过回调函数获得成功。

 shortUrl.short(url, function(err, url) {
      return url;
    })

基于此逻辑,我将创建一个闭包以能够定义一些功能,以便以后可以执行。

const valueToBeStored = (url)=>{

  let shortenedURL;
   return ()=>{
     shortUrl.short(url, function(err, result) {
     shortenedURL= result
      }
      return shortenedURL;
    }
}

const returnedFunc = valueToBeStored(url)
const storedValue = returnedFunc()

在我的示例中,我定义了一个名为valueToBeStored的函数,该函数采用一个参数url。在此函数的范围内,我声明一个变量以最终保存要存储的值。此函数返回一个函数,该函数使用您的api执行一些异步工作。由于闭包的概念,从函数返回函数会创建一个封闭变量环境,在此环境中,我们可以访问可用于缓存信息的私有变量。返回的函数会将执行异步工作的结果保存在外部函数的作用域中声明的变量中,内部函数现在将返回此变量,其中包含您要存储的值。

当执行线程看到此函数的声明时,它将把整个定义存储在内存中。

然后它将打到这一行:

const returnedFunc = valueToBeStored(url)

...它将调用存储在内存中的函数,将变量shortenedURL保存在外部函数上下文中的本地内存中,然后它将返回整个函数定义并将其保存在变量[C0中]。

一旦执行了这些代码行,线程现在就评估...

storedValue

...。如果您还记得,const storedValue = returnedFunc() 是一个函数定义,我们可以调用它并将其返回值保存在某个变量中。调用时,它将执行您的shortURL api方法,并将调用返回的值保存在returnedFunc变量中(由于关闭而可以访问),一旦该方法执行完毕,它将返回shortenedURL值存储在变量shortenedURL中。

© www.soinside.com 2019 - 2024. All rights reserved.