首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与Node.js通信并获取数据延迟

与Node.js通信并获取数据延迟
EN

Stack Overflow用户
提问于 2018-05-15 04:58:51
回答 2查看 127关注 0票数 0

我正在编写web crawler的程序。

我有server.js / crawling.js / dataCrawler.py

当我在crawlData上调用在crawling.js中定义的server.js时,我在crawling.js中定义的用于执行dataCrawler.py的方法将被调用。

我需要server.js中的数据,但是执行dataCrawler.py需要一段时间,所以我无法获得正确的数据,但只有null或未定义。

你有什么解决办法吗?还是有同样问题的人?

我的密码在下面。(我没有把这些放得很完美。仅供结构参考)

//server.js

代码语言:javascript
复制
var crawler = require("./crawling")
var resultArr = crawler.crawlData();
console.log('nodeserver:', resultArr)

//爬行

代码语言:javascript
复制
exports.crawlData = ()=>{

    var dataArr = [];
    var temp;

    var py = spawn('python', ['dataCrawler.py']);
    var data = [totalUrl, gubun];
    var dataFromPy = null;


    py.stdout.on('data', function(result){
        var dataArr = encoding.convert(result, 'utf-8')
        dataArr = JSON.parse(encoding.convert(result, 'utf-8'));

        py.stdout.on('end', function(){
            temp = dataArr
        });

    });

    py.stdin.write(JSON.stringify(data));

    py.stdin.end();

    return temp;

}

//dataCrawler.py

代码语言:javascript
复制
def crawling(url, gubun, page_count):

    idx = 0
    result = []
    jsonData = {}
    for i in range(1, page_count + 1):
        ....
        crawling code
        ....    
    return result


    def main():

    lines = sys.stdin.readlines()
    paraFromServer = json.loads(lines[0])
    url = paraFromServer[0]
    gubun = paraFromServer[1]

    result = crawling(url, gubun, page_count)

    print(result)


    main()
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-15 05:14:26

您没有考虑到javascript的异步特性。您必须做的是,将回调方法传递给crawlData方法,一旦完成刮取,就会调用该方法。

代码语言:javascript
复制
exports.crawlData = (cb)=>{
 ....
 py.stdout.on('data', function(result){
    var dataArr = encoding.convert(result, 'utf-8')
    dataArr = JSON.parse(encoding.convert(result, 'utf-8'));

    py.stdout.on('end', function(){
        cb(dataArr); // ideally the pattern is cb(error, data)
    });

 });

...

因此,server.js变成:

代码语言:javascript
复制
var crawler = require("./crawling")
crawler.crawlData((data) => { 
    console.log(data); 
    // Do whatever you want to do with the data.
});

回调会导致回调地狱。尝试探索promisesasync / await

票数 0
EN

Stack Overflow用户

发布于 2018-05-15 05:26:46

或者,如果不需要并行运行,也可以使用spawnSync

代码语言:javascript
复制
exports.crawlData = () => {
    const result = spawnSync('python', ['dataCrawler.py'], {
      input: JSON.stringify([totalUrl, gubun])
    });

    return JSON.parse(encoding.convert(result, 'utf-8'));
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50342603

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档