如何在nodejs中编写阻塞函数

时间:2012-12-10 15:33:40

标签: javascript node.js

嗨我想缩短我的网址

function shorutrl(link)
{
var linkpost = JSON.stringify({longUrl:link});.

        var optionslink = {
        host: "www.googleapis.com",
        port: 443,
        method: 'POST',
        path: "/urlshortener/v1/url",
        headers: {
        'Content-Type' : 'application/json'
        }
    };

optionslink.headers['Content-Length']=linkpost.length;
var linkreq = https.request(optionsimg, function(res) {
                res.on('data', function (d) {
                linkdata+=d;
                });
                res.on('end', function (x) {
                try { return JSON.parse(linkdata).id; } catch(e){ return link; }
                });
            }).on('error', function (e) {
                //console.log(e.message);
            });
linkreq.write(optionslink);
linkreq.end();
}

function nonworking_givelink()
{
   return shorutrl(txtlinks[Math.floor(Math.random() * txtlinks.length)]);
}

function working_givelink()
{
   return txtlinks[Math.floor(Math.random() * txtlinks.length)];
}

nonworking_givelink返回undefined working_givelink正常返回链接

我应该编写一个新函数并将参数传递给它并生成新链接并将参数传递给另一个函数是否有更简单的方法?

2 个答案:

答案 0 :(得分:3)

你不应该在node.js中编写阻塞代码,这违背了系统的设计。

您需要传递一个回调函数,该函数将使用.on('end', ...)块中的新网址进行调用。

或者,将其包装成一个自身发出事件的新对象,例如:

var https = require('https');
var events = require('events');

function GoogleShortener() {
    events.EventEmitter.call(this);
};

GoogleShortener.super_ = events.EventEmitter;
GoogleShortener.prototype = Object.create(events.EventEmitter.prototype, {
    constructor: {
        value: GoogleShortener,
        enumerable: false
    }
});

GoogleShortener.prototype.shorten = function(link) {

    var self = this;
    var data = JSON.stringify({longUrl: link});

    var options = {
        hostname: 'www.googleapis.com',
        port: 443,
        path: '/urlshortener/v1/url',
        method: 'POST',
        headers: {
            'Content-Type': 'application/json',
            'Content-Length': data.length
        }
    };

    var resp = '';

    var req = https.request(options, function(res) {
        res.setEncoding('utf8');
        res.on('data', function(d) {
            resp += d;
        }).on('end', function() {
            try {
                var id = JSON.parse(resp).id;
                self.emit('success', id);
            } catch (e) {
                self.emit('error', e);
            }
        });
    }).on('error', function(e) {
        self.emit('error', e);
    });

    req.write(data);
    req.end();

    return self;
};

exports.shorten = function(link) {
    return new GoogleShortener().shorten(link);
};

用法:

var g = require('gshort');
g.shorten('http://www.google.com/').on('success', function(link) {
     console.log(link)
});

答案 1 :(得分:0)

return不会从您希望它返回的函数返回。它从它周围的函数返回。考虑:

function foo() {
    var bar = function() {
        return "baz";  // This does _not_ return from `foo`! It returns from `bar`
    }
    bar();
}

console.log(foo())  // undefined