Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 返回单个数组_Javascript_Node.js - Fatal编程技术网

Javascript 返回单个数组

Javascript 返回单个数组,javascript,node.js,Javascript,Node.js,我正在努力理解如何从多次调用另一个函数的函数返回单个数组。目前,下面代码中的console.log每次运行scrapingfunction时都会输出一个不断增长的数组 最后一次运行scrapingfunction实际上是我想要的,但是我想找到一种方法,在hello函数的末尾返回一个数组,这样我就可以将每个对象放到数据库中。我猜这还不是我对javascript的理解 const hello = async () => { //[launch puppeteer and navig

我正在努力理解如何从多次调用另一个函数的函数返回单个数组。目前,下面代码中的console.log每次运行scrapingfunction时都会输出一个不断增长的数组

最后一次运行scrapingfunction实际上是我想要的,但是我想找到一种方法,在hello函数的末尾返回一个数组,这样我就可以将每个对象放到数据库中。我猜这还不是我对javascript的理解

const hello = async () => {
      //[launch puppeteer and navigate to page I want to scrape]
      await scrapingfunction(page)
      //[navigate to the next page I want to scrape]
      await scrapingfunction(page)
      //[navigate to the next page I want to scrape]
      await scrapingfunction(page)
    }

const scrapingfunction = async (page) => {
    const html = await page.content()
    const $ = cheerio.load(html)
    const data = $('.element').map((index, element)=>{   
        const dateElement = $(element).find('.sub-selement')
        const date = dateElement.text()
        return {date}
  }).get()
  console.log(data)
}


hello();

您遇到的问题是,
Promises
(这是
async/await
使用的“隐藏”功能)无法返回承诺链之外的值

这样想吧

你要求我为你写一篇StackOverflow文章,并立即要求得到该任务的结果,而不用等我完成它

当你给我设置任务时,我还没有完成它,所以我无法提供响应

您需要重新构造请求,以从
await
s返回值,然后由周围的
async
函数对其进行操作,例如:

# Assume doubleValue() takes some unknown time to return a result, like
# waiting for the result of an HTTP query.

const doubleValue = async (val) => return val * 2

const run = async () => {
  const result = []
  result.push(await doubleValue(2))
  result.push(await doubleValue(4))
  result.push(await doubleValue(8))
  console.log(result)
}
它将把
[4,8,16]
打印到控制台

您可能认为可以从
run()
返回结果并将其打印到控制台,如下所示:

const run = async () => {
  const result = []
  result.push(await doubleValue(2))
  result.push(await doubleValue(4))
  result.push(await doubleValue(8))
  return result
}
console.log(run())
但由于节点不知道
run()
何时拥有创建结果所需的一切,因此
console.log
不会打印任何内容。(由于
async
函数返回一个
Promise
,因此这并不是明确正确的,但该解释适用于本例。)

规则是,您可以在标记为
async
的函数中
等待
其他函数的结果,但不能将任何有用的结果返回到其周围的上下文中

由于
异步
函数确实返回
承诺
,因此您可以:

run().then(result => console.log(result))

但是请注意,结果永远不会离开
承诺链。

您遇到的问题是
承诺
(这是
异步/等待
使用的“隐藏”功能)无法返回承诺链之外的值

这样想吧

你要求我为你写一篇StackOverflow文章,并立即要求得到该任务的结果,而不用等我完成它

当你给我设置任务时,我还没有完成它,所以我无法提供响应

您需要重新构造请求,以从
await
s返回值,然后由周围的
async
函数对其进行操作,例如:

# Assume doubleValue() takes some unknown time to return a result, like
# waiting for the result of an HTTP query.

const doubleValue = async (val) => return val * 2

const run = async () => {
  const result = []
  result.push(await doubleValue(2))
  result.push(await doubleValue(4))
  result.push(await doubleValue(8))
  console.log(result)
}
它将把
[4,8,16]
打印到控制台

您可能认为可以从
run()
返回结果并将其打印到控制台,如下所示:

const run = async () => {
  const result = []
  result.push(await doubleValue(2))
  result.push(await doubleValue(4))
  result.push(await doubleValue(8))
  return result
}
console.log(run())
但由于节点不知道
run()
何时拥有创建结果所需的一切,因此
console.log
不会打印任何内容。(由于
async
函数返回一个
Promise
,因此这并不是明确正确的,但该解释适用于本例。)

规则是,您可以在标记为
async
的函数中
等待
其他函数的结果,但不能将任何有用的结果返回到其周围的上下文中

由于
异步
函数确实返回
承诺
,因此您可以:

run().then(result => console.log(result))

但是请注意,结果永远不会离开
承诺链。

我删除了
puppeter
标记,因为您的问题是关于使用async/wait,而不是puppeter特有的任何内容。您是如何将数据插入DB的?一个接一个的数组,或者你是否设法创建了某种方法将所有数组对象合并到一个数组中?我面临着类似的问题。谢谢我删除了
puppeter
标记,因为您的问题是关于使用async/await,而不是关于puppeter的任何特定内容。您是如何将数据插入数据库的?一个接一个的数组,或者你是否设法创建了某种方法将所有数组对象合并到一个数组中?我面临着类似的问题。谢谢非常感谢,这很有帮助。我通过在每次scrapingfunction完成时将数据发送到我的数据库,然后清除阵列来解决此问题,但您推荐的解决方案可能会更精简一些,因为它可以在一批中发送所有数据。非常感谢,这非常有帮助。我通过在每次scrapingfunction完成时将数据发送到我的db,然后清除数组来解决这个问题,但是您推荐的解决方案可能会更精简一些,因为最好是一批发送所有数据。