繁体   English   中英

python到node.js的困惑

[英]python to node.js confusion

所以我有这个python代码,我试图将其转换为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中,我似乎像在python中一样返回它,因为它是回调的处理方式,或者至少我似乎无法返回它,这就是为什么我问我将如何处理该节点。 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中有与此等效的东西吗? 另外,如果您可以指出一些有关异步代码的好的文档,那也很好。

由于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);
  });
};

会这样称呼:

var definition = new Definition('color', function() {
  console.log(definition.definition);
});

这是我两美分的建议。

永远不要使用正则表达式来解析HTML(有关更多详细信息,请参阅此处 ),而应使用类似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);
});

注意:这里我使用的是when (Promise +库),而不是Node的标准CPS样式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM