如何在nodejs中编写阻塞函数

嗨,我想缩短我的url

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返回正常的链接

我应该写一个新的函数,并传递参数,并生成新的链接,并将parameter passing给另一个函数是没有任何简单的方法吗?

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

您需要传递一个callback函数,该函数将在.on('end', ...)块中的新URL中调用。

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

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

return不从你想要返回的函数返回。 它立即从函数返回。 考虑:

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