【问题标题】:How to get the result inside callback function in javascript?如何在javascript中的回调函数中获取结果?
【发布时间】:2013-02-18 04:20:58
【问题描述】:

如果我想将结果写入回调函数内部进行响应,但我无法访问函数中的 res 变量,也无法访问函数外部的结果。

那么如何在内部和外部之间传递值呢?

var http = require('http');
var url = require('url');

http.createServer
(
    function (req, res)
    {
        var output='';
        res.writeHead(200, {'Content-Type': 'text/plain'});


        //The url we want is: 'www.random.org/integers/?num=1&min=1&max=10&col=1&base=10&format=plain&rnd=new'
        var options = {
          host: 'www.random.org',
          path: '/integers/?num=1&min=1&max=10&col=1&base=10&format=plain&rnd=new'
        };

        callback = function(response) {
          var str = '';

          //another chunk of data has been recieved, so append it to `str`
          response.on('data', function (chunk) {
            str += chunk;
          });

          //the whole response has been recieved, so we just print it out here
          response.on('end', function () {
            console.log(str);

            //output+=str; //get result
          });
        }

        http.request(options, callback).end();


        //output+=str; //get result
        res.end(output);
    }
).listen(80, '127.0.0.1');

ver2

var http = require('http');
var url = require('url');

http.createServer
(
    function (req, res)
    {
        var output='';
        res.writeHead(200, {'Content-Type': 'text/plain'});


        //The url we want is: 'www.random.org/integers/?num=1&min=1&max=10&col=1&base=10&format=plain&rnd=new'
        var options = {
          host: 'www.random.org',
          path: '/integers/?num=1&min=1&max=10&col=1&base=10&format=plain&rnd=new'
        };

        callback = function(response) {
          var str = '';

          //another chunk of data has been recieved, so append it to `str`
          response.on('data', function (chunk) {
            str += chunk;
          });

          //the whole response has been recieved, so we just print it out here
          response.on('end', function () {
            res.write('inside');
          });
        }

        http.request(options, callback).end();

        res.write('outside');
        res.end(output);
    }
).listen(80, '127.0.0.1');

ver3

var http = require('http');
var url = require('url');

http.createServer
(
    function (req, res)
    {
        res.writeHead(200, {'Content-Type': 'text/plain'});


        //The url we want is: 'www.random.org/integers/?num=1&min=1&max=10&col=1&base=10&format=plain&rnd=new'
        var options = {
          host: 'www.random.org',
          path: '/integers/?num=1&min=1&max=10&col=1&base=10&format=plain&rnd=new'
        };

        callback = function(res) {
          var str = '';

          //another chunk of data has been recieved, so append it to `str`
          res.on('data', function (chunk) {
            str += chunk;
          });

          //the whole response has been recieved, so we just print it out here
          res.on('end', function () {
            res.write('inside');
            //or
            this.write('inside');
          });
        }

        http.request(options, callback).end();


        res.write('outside');
        res.end();
    }
).listen(80, '127.0.0.1');

ver4

var http = require('http');
var url = require('url');

http.createServer
(
    function (req, res)
    {
        res.writeHead(200, {'Content-Type': 'text/plain'});


        //The url we want is: 'www.random.org/integers/?num=1&min=1&max=10&col=1&base=10&format=plain&rnd=new'
        var options = {
          host: 'www.random.org',
          path: '/integers/?num=1&min=1&max=10&col=1&base=10&format=plain&rnd=new'
        };

        callback = function(response) {
          var str = '';

          //another chunk of data has been recieved, so append it to `str`
          response.on('data', function (chunk) {
            str += chunk;
          });

          //the whole response has been recieved, so we just print it out here
          response.on('end', function () {
            res.write('inside');
          });
        }

        http.request(options, callback);


        res.write('outside');
        res.end();
    }
).listen(80, '127.0.0.1');

【问题讨论】:

  • 对于非建设性的评论我很抱歉,但是为什么可以在 javascript 中监听端口呢? node.js 是否使用了一些隐藏的 Java 小程序来实现这一点?
  • @TomášZato:节点正在服务器端运行
  • 啊,哇。所以这根本不是由浏览器执行的。 Javascript中的服务器?接下来发生什么? javascript中的操作系统...?还是谢谢你。
  • @TomášZato:嘿嘿,真的很酷!你应该检查一下:nodejs.org
  • @TomášZato:Fabrice Bellard 的 jslinux 在您的 javascript VM 上启动 linux。在浏览器中。 :-)

标签: javascript node.js callback


【解决方案1】:

你不能。设置回调的函数将在回调执行之前完成并返回。如果没有,则不需要回调。

在回调本身中做任何你需要做的工作,而不是在父函数中。

我无法访问函数中的 res 变量

你应该可以的。它仍在范围内。

(虽然如果你在回调运行之前调用end(),那么应该会损坏)。

【讨论】:

  • 在ver2中,我添加了res.write('inside')和res.write('outside'),输出只是“outside”,这个测试表明res超出了范围,只有父函数可以输出到响应,如果不在父函数中,我不知道怎么办。
  • @CLSo — 再次阅读答案的最后一行。
  • ... 并测试了第 2 版,其中包含该行所暗示的更改,并且可以正常工作。
  • 我仍然无法解决问题,我尝试将响应更改为 res (ver3),然后它以错误终止(TypeError: Object # has no method 'write'),res. write 和 this.write 相同,这意味着两个对象不同。而且我还阅读了答案的最后一行,并尝试删除 .end() (ver4),这次没有错误,但输出仍然只是“外部”。我不明白为什么你可以访问回调函数外部的 res 对象,也许这是版本问题?我的版本是 0.8.20
  • res 是在传递给createServer 的匿名函数的范围内定义的。回调函数是在该匿名函数内部定义的。因此,匿名函数范围内的任何内容也都在回调函数的范围内,除非回调函数在其范围内定义了一个具有相同名称的变量(因此从外部范围屏蔽了该变量)。
猜你喜欢
  • 2016-01-16
  • 2015-07-15
  • 2021-12-28
  • 1970-01-01
  • 2021-09-11
  • 2013-03-21
  • 1970-01-01
  • 2021-07-18
  • 1970-01-01
相关资源
最近更新 更多