Javascript 初学者Node.JS,不';我不能如期返回

Javascript 初学者Node.JS,不';我不能如期返回,javascript,node.js,Javascript,Node.js,事实上,我刚刚开始nodeJS,在过去的8个小时里我一直在干预它。我以前做过J2EE和.NET,也想加入NodeJS 我在尝试从Data.js文件获取响应时遇到了一个问题。我可以成功地字符串化数据,但由于某些原因,我无法将其返回。它最终在index.js路由器中为null或空字符串(其默认值)。我已经在下面的Data.js代码中用注释进行了解释 提前感谢您,请告诉我如何改进我的代码:) 我还有很多概念要学 index.js var express = require('express'); va

事实上,我刚刚开始nodeJS,在过去的8个小时里我一直在干预它。我以前做过J2EE和.NET,也想加入NodeJS

我在尝试从Data.js文件获取响应时遇到了一个问题。我可以成功地字符串化数据,但由于某些原因,我无法将其返回。它最终在index.js路由器中为null或空字符串(其默认值)。我已经在下面的Data.js代码中用注释进行了解释

提前感谢您,请告诉我如何改进我的代码:) 我还有很多概念要学

index.js

var express = require('express');
var router = express.Router();

/* GET home page. */
router.get('/', function(req, res, next) {
var Data = require('../public/javascripts/Data');
var responseString = Data.test;

  res.render('index', { d: responseString });
  console.log(responseString)
});

module.exports = router;
Data.js

var request = require('request'),
cheerio = require('cheerio'),
responseTitles = [],
responseUrls = [],
responseJSONArray = [],
responseTotalNumber = 0,
responseString = "";


function getData(){
request('URL',function(err,response,body){
    console.log("requesting..")
    if(!err && response.statusCode == 200){
        console.log("success..")
        var $ = cheerio.load(body);
        var data = [];
        data = $('span.titletext');
        data.each(function(i){
            responseTitles.push(data[i].children[0].data);
            responseUrls.push(data[i].parent.attribs.url);
            responseTotalNumber = i;

            responseJSONArray.push([{index: i, Title: data[i].children[0].data, url: data[i].parent.attribs.url}])
        });
        responseString = JSON.stringify(responseJSONArray);
        //At this point, responseString has all the data but
        //if I put the return here, it doesn't return anything
    }
  });
 //At this point responseString returns "". And so it returns an empty string
 return responseString;
}


module.exports= {
   test: getData()
};

您的
getData
函数正在异步调用
request
,然后立即返回
responseString
的值,该值始终为
'

想想代码:

module.exports= {
    test: getData()
};
这里发生了什么?你是

  • 立即执行
    getData
    函数,该函数:
    • 执行
      请求
      ,并
    • 返回
      '
  • 使用包含此结果(
    ''
    )的单个字段导出模块
  • 所以你基本上是这样做的:

    module.exports = {
        test: ''
    };
    
    我想这不是你的意图。你可能想要更接近这一点的东西:

    module.exports = {
        test: getData
    };
    
    排除paren意味着您返回的是函数本身,而不是调用函数的结果

    在异步工作时,您可能希望包含回调参数或从
    getData
    函数返回承诺,以便访问请求的结果。也许是这样的:

    Data.js:

    function getData (cb) {
        request('URL', function (err, response, body) {
    
           ...
    
           responseString = JSON.stringify(responseJSONArray);
           cb(responseString);
        });
    }
    
    module.exports = {
        test: getData
    };
    
    然后像这样使用它:

    Index.js

    var data = require('../public/javascripts/Data');
    router.get('/', function (req, res, next) {
        data.test(function (responseString) {
            res.render('index', { d: responseString });
        });
    });
    

    您的
    getData
    函数正在异步调用
    request
    ,然后立即返回
    responseString
    的值,该值始终为
    '

    想想代码:

    module.exports= {
        test: getData()
    };
    
    这里发生了什么?你是

  • 立即执行
    getData
    函数,该函数:
    • 执行
      请求
      ,并
    • 返回
      '
  • 使用包含此结果(
    ''
    )的单个字段导出模块
  • 所以你基本上是这样做的:

    module.exports = {
        test: ''
    };
    
    我想这不是你的意图。你可能想要更接近这一点的东西:

    module.exports = {
        test: getData
    };
    
    排除paren意味着您返回的是函数本身,而不是调用函数的结果

    在异步工作时,您可能希望包含回调参数或从
    getData
    函数返回承诺,以便访问请求的结果。也许是这样的:

    Data.js:

    function getData (cb) {
        request('URL', function (err, response, body) {
    
           ...
    
           responseString = JSON.stringify(responseJSONArray);
           cb(responseString);
        });
    }
    
    module.exports = {
        test: getData
    };
    
    然后像这样使用它:

    Index.js

    var data = require('../public/javascripts/Data');
    router.get('/', function (req, res, next) {
        data.test(function (responseString) {
            res.render('index', { d: responseString });
        });
    });
    

    这是有道理的,但我该如何着手解决它呢?很抱歉,尽管我以前使用过异步调用,但在.NET中,我仍然没有在NodeJS中得到这个概念。是否可以只返回responseString而不是实际返回整个函数?responseString变量在我按照注释中的说明字符串化ResponseGray变量之后,确实拥有所有数据。但似乎是这样的,因为该方法是异步的,所以它没有等待response@ExPlOiD看看我给你举的例子。无法返回
    resultString
    本身-您必须在调用
    request
    完成后异步访问它。好的,非常感谢!我有很多东西要学,这只是开始!:)这是有道理的,但我该如何着手解决它呢?很抱歉,尽管我以前使用过异步调用,但在.NET中,我仍然没有在NodeJS中得到这个概念。是否可以只返回responseString而不是实际返回整个函数?responseString变量在我按照注释中的说明字符串化ResponseGray变量之后,确实拥有所有数据。但似乎是这样的,因为该方法是异步的,所以它没有等待response@ExPlOiD看看我给你举的例子。无法返回
    resultString
    本身-您必须在调用
    request
    完成后异步访问它。好的,非常感谢!我有很多东西要学,这只是开始!:)这是关于异步Javascript编程最常见的重复问题之一。这是关于异步Javascript编程最常见的重复问题之一。