首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pythontonode.js混淆

Pythontonode.js混淆
EN

Stack Overflow用户
提问于 2013-12-13 02:07:25
回答 2查看 581关注 0票数 0

因此,我有这个python代码,我正在尝试转换为node.js,但我不知道如何转换。

代码语言:javascript
复制
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中一样返回它,因为它是做事情的回调方式,或者至少我似乎无法返回它--这就是为什么我会问我如何实现node.js等效的,或者它们是否等效?这是我到目前为止所拥有的,也许你可以找出我做错了什么,以及如何修复它

代码语言:javascript
复制
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中是否有类似的概念呢?另外,如果您可以向我介绍一些关于异步代码的好文档,那也是很棒的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-13 02:15:19

由于return实际上只是退出函数而不是返回值,所以需要使用回调。看起来是这样的:

代码语言:javascript
复制
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);
  });
};

然后在调用函数时传递一个回调:

代码语言:javascript
复制
getDef('color', function(definition) {
  console.log(definition);
});

编辑:设置对象属性的有相同的想法。相反,它可能是这样的:

代码语言:javascript
复制
var Definition = function(word) {
  var self = this;

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

会被这样称呼:

代码语言:javascript
复制
var definition = new Definition('color', function() {
  console.log(definition.definition);
});
票数 2
EN

Stack Overflow用户

发布于 2013-12-13 09:19:09

这是我的两分钱的建议。

从不使用正则表达式解析(更多细节请参考这里 ),而使用类似于XPath的库来解析文档。您可以使用像干杯幻影这样的库。

这是一个干净的解决方案。

代码语言:javascript
复制
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);
});

注意:这里我使用的是什么时候 (一个Promise+库),而不是Node的标准CPS风格。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20557890

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档