Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在nodejs中编写阻塞函数_Javascript_Node.js - Fatal编程技术网

Javascript 如何在nodejs中编写阻塞函数

Javascript 如何在nodejs中编写阻塞函数,javascript,node.js,Javascript,Node.js,嗨,我正在尝试缩短我的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

嗨,我正在尝试缩短我的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)];
}
非工作链接返回未定义的工作链接


我是否应该编写一个新函数并向其传递参数,然后生成新链接并将参数传递给另一个函数?没有更简单的方法吗?

您不应该在node.js中编写阻塞代码,这与系统的设计背道而驰

您需要传递一个回调函数,该函数将在('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

在哪里工作\u givelink
?我的参数超过1KB,我已经将它们传递给3-4,用于图像链接、描述、文本和链接,并且我已经使用return at.on('end'event参数的大小与此无关,您无法按现有方式编写此函数。您必须安排在知道最终结果后调用异步函数。因此,他们必须删除返回函数它不是必需的,而返回的内容并不重要