1
class Search
  perform: (text) ->
    query = encodeURIComponent text
    results = ''
    request {uri: @uri + query }, (error, response, body) =>
      if !error? && response.statusCode == 200
        window = jsdom.jsdom(body).createWindow()
        jsdom.jQueryify window, './jquery-1.5.min.js', (window, jquery) =>
          $ = window.$
          jquery(@pattern).each (i, lmn) =>
            link = $(lmn).text() + " - " +  $(lmn).attr('href') 
            if requiresHttp? && /^http/.exec  $(lmn).attr('href')
              results = results + link + "\n"
            else
              results = results + link + "\n"
          @emit 'end', results

sys.inherits(Search, process.EventEmitter)

class Google extends Search
  @uri     = 'http://www.google.com/search?q='
  @pattern = '#ires ol li .r a'

実行すると

google = new Google
google.perform 'blah'

「TypeError:Object #Google has nomethod'perform'」というエラーが返されます。拡張はそのメソッドを提供するべきではありませんか?

アップデート

投稿後すぐに、コードをリファクタリングしました。作業結果は次のとおりです。

{EventEmitter} = require "events"
request        = require 'request'
jsdom          = require 'jsdom'


class Search extends EventEmitter
  constructor: ->
    @linkPrefix   = ''
    @requiresHttp = false
    @uri          = ''
    @pattern      = ''
  perform: (text) ->
    query = encodeURIComponent text
    results = ''
    request {uri: @uri + query }, (error, response, body) =>
      if !error? && response.statusCode == 200
        window = jsdom.jsdom(body).createWindow()
        jsdom.jQueryify window, './jquery-1.5.min.js', (window, jquery) =>
          $ = window.$
          jquery(@pattern).each (i, lmn) =>
            link = $(lmn).text() + " - " + @linkPrefix + $(lmn).attr('href') 
            if @requiresHttp?
              if /^http/.exec  $(lmn).attr('href')
                results = results + link + "\n"
            else
              results = results + link + "\n"
          @emit 'end', results

class Google extends Search
  constructor: ->
    @uri          = 'http://www.google.com/search?q='
    @pattern      = '#ires ol li .r a'
    @requiresHttp = true

class Youtube extends Search
  constructor: ->
    @uri          = 'http://www.youtube.com/results?search_query='
    @pattern      = '#search-results h3 a'
    @linkPrefix   = 'http://www.youtube.com'


exports.Google  = Google
exports.Youtube = Youtube
4

1 に答える 1

3

CD Sandchez のコメントは正しいです。sys.inherits線を切り取るとperform走ります。

代わりに行うべきことは、CoffeeScript の継承をずっと使用することです。

class Search extends process.EventEmitter
于 2011-04-24T21:55:04.807 に答える