2013-12-13 75 views
0

所以我有這個python代碼,我試圖轉換爲node.js,但我不知道如何。蟒蛇node.js混淆

import urllib.request, re 
def getDef(word): 
    link = "http://www.merriam-webster.com/dictionary/%s" % word 
    data = urllib.request.urlopen(link).read().decode() 
    try: 
     return re.search("<p>: (.*?)</p><p>", data).group(1) 
    except: 
     return "No match" 
class newDefinition: 
    def __init__(self, word): 
     self.definition = getDef(word); 
>>> definition = newDefintion("color") 
>>> print(definition.definition) 
a quality such as red, blue, green, yellow, etc., that you see when you look at something 

在node.js的不過雖然我似乎可以像,因爲它蟒蛇返回它的行事方式回調,或至少我似乎無法歸還這就是爲什麼我問我該如何做node.js等價物或者它們是否等價?以下是我迄今爲止也許你能發現什麼,我做錯了,如何解決它

var urllib = require("urllib"); // installed with npm 
var getDef = function(word){ 
    var link = "http://www.merriam-webster.com/dictionary/" + word; 
    var urlData = urllib.request(link, {}, function(err, data, res){ 
     var re = new RegExp("<p>: (.*?)</p><p>"); 
     var results = data.toString(); 
     var match = re.exec(results)[1]; 
     return match; // Expected it to give urlData the definition 
    }); 
    return urlData; 
} 
var Definition = function(word){ 
    this.definition = getDef(word); 
} 
definition = new Definition("color"); 
console.log(definition.definition); // this won't give the definition but the information of the urllib itself rather. 

所以一般試圖找出是如何使用異步代碼,這樣我就可以回事情,我需要,但我不使用這個概念,所以有沒有相當於這個在python中?另外如果你可以指點我一些關於異步代碼的很好的文檔,那也是很棒的。

回答

2

由於return實際上只是退出你的函數而不是返回一個值,所以你需要使用回調函數。它應該是這樣的:

var urllib = require("urllib"); 
var getDef = function(word, callback){ 
    var link = 'http://www.merriam-webster.com/dictionary/' + word; 
    urllib.request(link, {}, function(err, data, res) { 
    var re = new RegExp('<p>: (.*?)</p><p>'); 
    var results = data.toString(); 
    var match = re.exec(results)[1]; 
    callback(match); 
    }); 
}; 

然後你會傳遞一個回調而調用函數:

getDef('color', function(definition) { 
    console.log(definition); 
}); 

編輯:設定一個對象的屬性有同樣的想法。它看起來像這個:

var Definition = function(word) { 
    var self = this; 

    getDef(world, function(definition, callback) { 
    self.definition = definition; 
    callback.call(self); 
    }); 
}; 

而且會被稱爲像這樣:

+0

我明白了,但如果我不想打印數據並想存儲它或爲其設置變量名呢?像'this.definition = definition'不會工作,因爲它會認爲這是回調函數?我會編輯我的問題來反駁這個,抱歉讓我感到困惑。 – ruler

+0

你可以這樣做,但它必須在提取定義的函數的回調中完成。 – hexacyanide

+0

我已經編輯了這個問題來展示我正在努力做的一個更好的例子,因爲第一個例子並沒有真正展示爲什麼我不知道如何使用異步代碼的好例子。 – ruler

1

這裏是我的兩個美分值得建議。

從來沒有使用正則表達式來解析HTML(請參閱here瞭解更多詳細信息),而是使用類似XPath的庫來解析文檔。您可以使用庫如cheeriophantomjs

這是一個乾淨的解決方案。

var request = require('request'), 
    when = require('when'), 
    cheerio = require('cheerio'); 

var URL = 'http://www.merriam-webster.com/dictionary/'; 

/** 
* @param word: Word to search the dictionary 
* @returns 
* Promise object which resolves to array of 
* definitions of the word 
*/ 
var getDef = function(word){ 
    var defer = when.defer(); 
    request(URL + word, function(err, res, body){ 
     if (err || res.statusCode !== 200){ 
      defer.reject(); 
     } 
     var defs = []; 
     var $ = cheerio.load(body); 
     $('.wordclick .headword:first-child p').each(function(i,ele){ 
      var definition = $(ele).text(); 
      defs.push(definition); 
     }); 

     defer.resolve(defs); 
    }); 
    return defer.promise; 
} 

getDef('happy').then(function(words){ 
    console.log(words); 
}); 

注:在這裏,我使用的,而不是節點的標準CPS風格when(許諾+庫)。