Javascript 从节点中的另一个模块导入的异步数据无法解析,如何修复此问题?
这是收集和导出异步数据的模块:scraper.jsJavascript 从节点中的另一个模块导入的异步数据无法解析,如何修复此问题?,javascript,node.js,asynchronous,import,async-await,Javascript,Node.js,Asynchronous,Import,Async Await,这是收集和导出异步数据的模块:scraper.js const express = require('express') const cheerio = require('cheerio') const request = require("tinyreq") const fs = require('fs') const _ = require('lodash') const uuid = require('uuid/v4') const async = require('async') c
const express = require('express')
const cheerio = require('cheerio')
const request = require("tinyreq")
const fs = require('fs')
const _ = require('lodash')
const uuid = require('uuid/v4')
const async = require('async')
const mental_models = {
url: 'https://www.farnamstreetblog.com/mental-models/',
data: {}
}
const decision_making = {
url: 'https://www.farnamstreetblog.com/smart-decisions/',
data: {}
}
const cognitive_bias = {
url: 'https://betterhumans.coach.me/cognitive-bias-cheat-sheet-55a472476b18',
data: {}
}
const DATA_URLS = [mental_models, decision_making, cognitive_bias]
const filterScrape = async (source, params) => {
let filtered_data = {
topics: [],
content: [],
additional_content: []
}
let response = await scrape(source)
try {
let $ = cheerio.load(response)
params.forEach((elem) => {
let headers = ['h1', 'h2', 'h3']
if ($(elem) && headers.includes(elem)) {
let topic = {}
let content = {}
let id = uuid()
topic.id = id
topic.text = $(elem).text()
if ($(elem).closest('p')) {
content.text = $(elem).closest('p').text()
content.id = id
}
filtered_data.topics.push(topic)
filtered_data.content.push(content)
} else if ($(elem) && !headers.includes(elem)) {
let content = {}
let id = uuid()
content.text = $(elem).text()
content.id = id
filtered_data.additional_content.push(content)
} else {
}
})
}
catch (err) {
console.log(err)
}
return filtered_data
}
const scrape = (source) => {
return new Promise((resolve, reject) => {
request(source.url, function (err, body) {
if (err) {
reject(err)
return
}
resolve(body)
})
})
}
const DATA = _.map(DATA_URLS, async (source) => {
let params = ['h1', 'h2', 'h3', 'p']
let new_data = await filterScrape(source, params)
try {
source.data = new_data
}
catch (err) {
console.log(err)
}
})
module.exports = DATA
这是导入数据的模块:neural.js
const brain = require('brain')
const neural_net = new brain.NeuralNetwork()
const DATA = require('./scraper')
console.log(DATA)
显然没有什么进展,我已经删除了代码,因为变量没有解析。记录时,它会记录一个承诺,但该承诺不会解决。但是,在导入的模块中,承诺会被记录下来,然后解析。有什么好处?我应该导入解析数据的函数吗?当然最好导入该函数,但是它不会改变代码中的问题,如下所示:
const DATA = _.map(DATA_URLS, async (source) => {
Lodash不支持异步迭代-因此您需要其他一些方法,一种是使用最新的nodejs版本(10.x)并使用异步迭代-但这不会使用异步代码的全部功能
你也可以使用我公司支持的框架。上述代码将采用以下形式:
const {DataStream} = require("scramjet");
const DATA_URLS = [mental_models, decision_making, cognitive_bias];
module.exports = async () => DataStream.fromArray(DATA_URLS)
.setOptions({maxParallel: 2}) // if you need to limit that at all.
.map(async ({url}) => {
let params = ['h1', 'h2', 'h3', 'p']
let data = await filterScrape(source, params);
return { url, data };
})
.toArray();
const brain = require('brain')
const neural_net = new brain.NeuralNetwork()
const scraper = require('./scraper')
(async (){
const DATA = await scraper();
console.log(DATA); // or do whatever else you were expecting...
})();
另一个文件将采用以下形式:
const {DataStream} = require("scramjet");
const DATA_URLS = [mental_models, decision_making, cognitive_bias];
module.exports = async () => DataStream.fromArray(DATA_URLS)
.setOptions({maxParallel: 2}) // if you need to limit that at all.
.map(async ({url}) => {
let params = ['h1', 'h2', 'h3', 'p']
let data = await filterScrape(source, params);
return { url, data };
})
.toArray();
const brain = require('brain')
const neural_net = new brain.NeuralNetwork()
const scraper = require('./scraper')
(async (){
const DATA = await scraper();
console.log(DATA); // or do whatever else you were expecting...
})();
当然,最好导入该函数,但它不会改变代码中的问题,如下所示:
const DATA = _.map(DATA_URLS, async (source) => {
Lodash不支持异步迭代-因此您需要其他一些方法,一种是使用最新的nodejs版本(10.x)并使用异步迭代-但这不会使用异步代码的全部功能
你也可以使用我公司支持的框架。上述代码将采用以下形式:
const {DataStream} = require("scramjet");
const DATA_URLS = [mental_models, decision_making, cognitive_bias];
module.exports = async () => DataStream.fromArray(DATA_URLS)
.setOptions({maxParallel: 2}) // if you need to limit that at all.
.map(async ({url}) => {
let params = ['h1', 'h2', 'h3', 'p']
let data = await filterScrape(source, params);
return { url, data };
})
.toArray();
const brain = require('brain')
const neural_net = new brain.NeuralNetwork()
const scraper = require('./scraper')
(async (){
const DATA = await scraper();
console.log(DATA); // or do whatever else you were expecting...
})();
另一个文件将采用以下形式:
const {DataStream} = require("scramjet");
const DATA_URLS = [mental_models, decision_making, cognitive_bias];
module.exports = async () => DataStream.fromArray(DATA_URLS)
.setOptions({maxParallel: 2}) // if you need to limit that at all.
.map(async ({url}) => {
let params = ['h1', 'h2', 'h3', 'p']
let data = await filterScrape(source, params);
return { url, data };
})
.toArray();
const brain = require('brain')
const neural_net = new brain.NeuralNetwork()
const scraper = require('./scraper')
(async (){
const DATA = await scraper();
console.log(DATA); // or do whatever else you were expecting...
})();
async
import是否与本机async
操作符冲突?我也不认为您曾经使用过async
库,但您希望使用ES6async
操作符。你真的这么做了为什么const async=require('async')
?@lukaleli是的,很好的一点,我只是忘记了,在重构后把它放在那里了,现在我看到的fs也是一样。它解决了你的问题吗?@lukaleli Nope:(导入async
import是否与本机async
操作符冲突?我也不认为您曾经使用过async
库,但您希望使用ES6async
操作符。实际上您正在这样做,为什么const async=require('async'))
?@lukaleli是的,很好,重构后我忘了放在那里,现在我看到的fs也是一样。它解决了你的问题吗?@lukaleli没有:(