Javascript 从节点中的另一个模块导入的异步数据无法解析,如何修复此问题?

Javascript 从节点中的另一个模块导入的异步数据无法解析,如何修复此问题?,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

这是收集和导出异步数据的模块: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')


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
库,但您希望使用ES6
async
操作符。你真的这么做了为什么
const async=require('async')
?@lukaleli是的,很好的一点,我只是忘记了,在重构后把它放在那里了,现在我看到的fs也是一样。它解决了你的问题吗?@lukaleli Nope:(导入
async
import是否与本机
async
操作符冲突?我也不认为您曾经使用过
async
库,但您希望使用ES6
async
操作符。实际上您正在这样做,为什么
const async=require('async'))
?@lukaleli是的,很好,重构后我忘了放在那里,现在我看到的fs也是一样。它解决了你的问题吗?@lukaleli没有:(