ericallam / execjs-async

Enables asynchronous Javascript execution in ExecJS
12 stars 10 forks source link

README example broken #3

Open ssimeonov opened 10 years ago

ssimeonov commented 10 years ago

I love the idea of being able to use async JS processing from Ruby, which is why I wanted to do some DOM analysis experiments with execjs-async. Unfortunately, the README example seems broken. I am getting the following error on NodeJS 0.10.26 with Ruby 2.0.0-p353.

irb(main):013:0> context = ExecJS.compile_async <<-JAVASCRIPT
irb(main):014:0"   var run = function(html, code){
irb(main):015:0"     var jsdom = require('jsdom');
irb(main):016:0"
irb(main):017:0"     jsdom.env(html, function(errors, window) {
irb(main):018:0"       callback(window.document.getElementByName('body').innerHTML);
irb(main):019:0"     });
irb(main):020:0"   }
irb(main):021:0" JAVASCRIPT
=> #<Execjs::Async::Context:0x007fd1c24670f8 @runtime=#<ExecJS::ExternalRuntime:0x007fd1c3853120 @name="Node.js (V8)", @command=["nodejs", "node"], @runner_path="/Users/sim/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/execjs-2.0.2/lib/execjs/support/node_runner.js", @test_args=nil, @test_match=nil, @encoding="UTF-8", @deprecated=false, @binary="node">, @source="  var run = function(html, code){\n    var jsdom = require('jsdom');\n\n    jsdom.env(html, function(errors, window) {\n      callback(window.document.getElementByName('body').innerHTML);\n    });\n  }\n">
irb(main):022:0> context.call 'run', "<p>Hello World</p>"
ExecJS::RuntimeError:
/private/var/folders/ln/j4dkd3bd07d_7tzqc843y2jw0000gn/T/execjs20140513-38448-1l9wlys.js:5
      callback(window.document.getElementByName('body').innerHTML);
                               ^
TypeError: Object [ null ] has no method 'getElementByName'
    at /private/var/folders/ln/j4dkd3bd07d_7tzqc843y2jw0000gn/T/execjs20140513-38448-1l9wlys.js:5:32
    at /Users/sim/node_modules/jsdom/lib/jsdom.js:255:9
    at process._tickCallback (node.js:415:13)

    from /Users/sim/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/execjs-2.0.2/lib/execjs/external_runtime.rb:142:in `exec_runtime'
    from /Users/sim/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/execjs-2.0.2/lib/execjs/external_runtime.rb:28:in `block in exec'
    from /Users/sim/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/execjs-2.0.2/lib/execjs/external_runtime.rb:41:in `compile_to_tempfile'
    from /Users/sim/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/execjs-2.0.2/lib/execjs/external_runtime.rb:27:in `exec'
    from /Users/sim/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/execjs-2.0.2/lib/execjs/external_runtime.rb:19:in `eval'
    from /Users/sim/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/execjs-2.0.2/lib/execjs/external_runtime.rb:33:in `call'
    from (irb):22
    from /Users/sim/.rbenv/versions/2.0.0-p353/bin/irb:12:in `<main>'
Yenwod commented 10 years ago

@ssimeonov, I was able to get the README example to work by changing it a bit, like this:

   context = ExecJS.compile_async <<-JAVASCRIPT
      var run = function(html, code){
        var jsdom = require('jsdom');
        jsdom.env(html, function(errors, window) {
          callback(window.document.getElementById('my_header').innerHTML);
        });
      }
    JAVASCRIPT
    context.call 'run', "<html><body><div id='my_header'><p>Hello World</p></div></body></html>"