在Node中与jsdom和jquery共享变量作用域

时间:2014-11-04 16:13:48

标签: javascript jquery node.js jsdom

所以,我正在用jsdom和jquery编写一个简单的页面刮板,遇到了一个我不确定如何解决的问题。

以下是一些有效的代码(更改了网址):

var jsdom = require("jsdom");
var fs = require('fs');
var jquery = fs.readFileSync("./js/jquery-min.js").toString();

//There's two pages of product, here's page 1
jsdom.env({
        url: 'http://exampleshoppingpage.com',
        src: [ jquery ],
        done: function(error, window){
                var $ = window.$;
                $('.productlist .product .title a').each(function() {
                        console.log($(this).text());
                });
        } 
});

//And do the exact same thing for page 2
jsdom.env({
        url: 'http://exampleshoppingpage.com?page=2',
        src: [ jquery ],
        done: function(error, window){
                var $ = window.$;
                $('.productlist .product .title a').each(function() {
                        console.log($(this).text());
                });
        } 
});

但我真正想做的是获取所有这些产品并在打印之前对它们进行排序。这就是我的尝试:

var jsdom = require("jsdom");
var fs = require('fs');
var jquery = fs.readFileSync("./js/jquery-min.js").toString();
var products = [];


//There's two pages of product, here's page 1
jsdom.env({
        url: 'http://exampleshoppingpage.com',
        src: [ jquery ],
        done: function(error, window){
                var $ = window.$;
                products $('.productlist .product .title a').each(function() {
                        products.push($(this).text());
                });
        } 
});

//And do the exact same thing for page 2
jsdom.env({
        url: 'http://exampleshoppingpage.com?page=2',
        src: [ jquery ],
        done: function(error, window){
                var $ = window.$;
                $('.productlist .product .title a').each(function() {
                        products.push($(this).text());
                });
        } 
});

products = products.sort();
console.log (products.join("\n"));

我得到一个空数组。我尝试了其他一些方法来确定我是否只是在做一些愚蠢的事情。我假设它与jsdom中的jQuery有关,而不是与程序的外部共享范围?

1 个答案:

答案 0 :(得分:1)

这是我们必须记住异步思考的情况。您的范围很好,但是在填充数据之前,您尝试将products转储到控制台。

此外,Array.prototype.sort() operates on the array directly。它不会返回数组。

var jsdom = require("jsdom");
var jquery = "http://code.jquery.com/jquery.js";

var products = [];

//  page 1
jsdom.env({
        url: 'http://news.ycombinator.com/',
        scripts: [ jquery ],
        done: function(error, window){
                var $ = window.$;
                $('td.title:not(:last) a').each(function() {
                        products.push( $(this).text() );
                });
                //      page 2
                jsdom.env({
                        url: 'https://news.ycombinator.com/news?p=2',
                        scripts: [ jquery ],
                        done: function(error, window){
                                var $ = window.$;
                                $('td.title:not(:last) a').each(function() {
                                        products.push( $(this).text() );

                                });
                                products.sort();
                                console.log( products );
                        }
                });
        }
});