Javascript 返回单个数组
我正在努力理解如何从多次调用另一个函数的函数返回单个数组。目前,下面代码中的console.log每次运行scrapingfunction时都会输出一个不断增长的数组 最后一次运行scrapingfunction实际上是我想要的,但是我想找到一种方法,在hello函数的末尾返回一个数组,这样我就可以将每个对象放到数据库中。我猜这还不是我对javascript的理解Javascript 返回单个数组,javascript,node.js,Javascript,Node.js,我正在努力理解如何从多次调用另一个函数的函数返回单个数组。目前,下面代码中的console.log每次运行scrapingfunction时都会输出一个不断增长的数组 最后一次运行scrapingfunction实际上是我想要的,但是我想找到一种方法,在hello函数的末尾返回一个数组,这样我就可以将每个对象放到数据库中。我猜这还不是我对javascript的理解 const hello = async () => { //[launch puppeteer and navig
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,然后清除数组来解决这个问题,但是您推荐的解决方案可能会更精简一些,因为最好是一批发送所有数据。