【问题标题】:Assigning a returned result for a function in a different file to a variable将不同文件中函数的返回结果分配给变量
【发布时间】:2019-07-03 06:37:53
【问题描述】:

我在 utils 文件中有一个函数,我想调用它并将导出的结果分配给一个变量。

当前,变量已定义,然后我尝试分配返回结果,但是当我 console.log 时,我得到未定义的结果。

这是我的 utils/consul 文件

var consul = require("consul")({host: config.consul.host'});
var consulBase = [];
var options;

module.exports = {
  consulQuery:  function(service){
      consul.catalog.service.nodes(service, function(err, results) {
          if(err) {console.log(err); throw err;}
           if(results.length <= 0) return {message: `Error could not find any service of ${service} registered with consul,`, errorCode: 500};
          if(results.length > 0) consulBase = [];
          results.forEach((result) => {
            consulBase.push(result.ServiceAddress+ ':' +result.ServicePort);
          });
          var serviceURL = 'http://' + consulBase[Math.floor(Math.random()*consulBase.length)];
          return options = {
            baseUrl : serviceURL,
            form: {'':''},
            headers: {authorization: ''}
          };    
        });
    }

然后在另一个文件中,我这样调用,然后尝试将值分配给 'options' 但未定义。

var consulQuery = require("../utils/consul").consulQuery;

// Get options array right away
var options = consulQuery('auth');

// Get options array every 5 seconds
setInterval(() => {
  options = consulQuery('auth');
  console.log(options);
}, 5 * 1000);

【问题讨论】:

  • @CertainPerformance 它是如何重复的?我的问题和它不同。我看了看,看不出它是如何解决我的问题的。
  • 问题几乎一模一样。您正在尝试从异步调用返回响应。
  • ^问题的本质是相同的,要解决它,您需要了解这两个问题是如何归结为相同的:从异步调用返回一个变量。
  • consul.catalog.service.nodes(service, function(err, results) {:这个函数有一个回调作为第二个参数=它是异步的。如果不是,则没有任何理由将回调作为参数。

标签: node.js function include export utility-method


【解决方案1】:

好的,你有几个问题。

首先,是关于你想要做什么的概念。其次是您实际上需要更改代码以使其正常工作。

我不会谈论第一部分,因为有很多很好的资源可以通过示例更好地学习异步,然后我可以在这里做。

对于您的代码的实际问题:

  1. 您缺少 consulQuery() 的回调

应该是这样的(注意我添加的cb):

module.exports = {
    consulQuery: function (service, cb) {
        consul.catalog.service.nodes(service, function (err, results) {
            if (err) {
                console.log(err);
                cb(err, null)
                throw err;
            }
            if (results.length <= 0) return {
                message: `Error could not find any service of ${service} registered with consul,`,
                errorCode: 500
            };
            if (results.length > 0) consulBase = [];
            results.forEach((result) => {
                consulBase.push(result.ServiceAddress + ':' + result.ServicePort);
            });
            var serviceURL = 'http://' + consulBase[Math.floor(Math.random() * consulBase.length)];
            cb(null, {
                baseUrl: serviceURL,
                form: {'': ''},
                headers: {authorization: ''}
            });
        });
    }
}

其次,在您调用该函数的另一个文件中,您现在必须传递一个回调函数。

options = consulQuery('auth', (err, response) => {
if(err){
console.log(err)
}
console.log(response)

});

【讨论】:

  • 刚刚试了一下,使用你的代码我也得到了未定义的选项。似乎我的第一个没有运行,而是只有我的 setInterval 中的一个。
  • 当我在路由文件中调用它时,我看到它是一个函数,但它不会运行。
猜你喜欢
  • 1970-01-01
  • 2022-01-06
  • 2010-10-02
  • 1970-01-01
  • 2020-10-05
  • 1970-01-01
  • 2013-11-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多