【问题标题】:Using an array populated in one function in another function在另一个函数中使用填充在一个函数中的数组
【发布时间】:2019-02-05 14:43:00
【问题描述】:

我需要在一个函数中填充一个数组并在另一个函数中使用这个数组。但是,当我在不同的函数中检查该数组时,它会返回一个空数组。

这是我的示例代码:

var express = require('express');
var app = express();
var bodyParser = require('body-parser');
var server = require('http').createServer(app);
var path = require('path');
var port = process.env.PORT || 3004;

let columns = new Array ();

server.listen(port, function () {
  console.log('Server listening at port %d', port);
});

//Server receives AJAX requests of JSON Data
app.use(bodyParser.json()); // for parsing application/json
// for parsing application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: true })); 
app.use(express.static(path.join(__dirname, 'public')));

app.post('/', function (req, res) {
  updateworkbook(req.body); 
  res.send('Thanks for the data.');
});

//Here's where I'm using 'columns'
function updateworkbook(data) {
  getcolumns();
  console.log(columns);
  // some code to write back data to MYSQL which depends on 'COLUMNS'
}


//Here's where I'm populating 'columns' array
function getcolumns() {
  //Code to get a RowDataPacket object as 'results' from MySQL
  for (let i = 0; i < results.length; i++) {
    columns.push(results[i]['COLUMN_NAME'])
  }
  console.log(columns)  //This works perfectly fine and prints out all the values
  return columns;
};

我希望看到在 getcolumns 函数期间推送的所有列值,但它只是打印出 []

【问题讨论】:

  • COLUMN_NAME 指的是results数组的每个对象内的某个子对象?
  • 我感觉您遇到了时间问题:results 是否被异步填充(例如通过 AJAX 请求)?这或许可以解释为什么记录 columns 返回一个空数组。你能告诉我们什么在调用getcolumns()吗?
  • @Terry 在我看来是正确的答案。将updateworkbook()改成异步函数,让console.log(columns);等待getcolumns();完成。
  • @Terry,编辑了问题以包含几乎整个代码。我正在通过这个监听 ajax 请求并为此调用 getcolumns() 。但是,我并不完全清楚如何使 updateworkbook 功能异步
  • 我已经用异步代码更新了我的示例

标签: javascript arrays ajax


【解决方案1】:

我想补充一下using global vars is a bad practice,因为它可能会导致难以调试的问题。如果可以,请不要使用它们。

考虑将您的代码重写为:

function getcolumns()
{
   return new Promise(function(resolve, reject)
   {
       var columns = [];
       // populate the columns array asynchronously
       resolve(columns);
   });


}


function updateworkbook()
{
   getcolumns().then(function(cols){
      // do something with the value
      console.log(cols);
   });

}

【讨论】:

  • 我用同样的方式让它工作了一段时间。不过感谢您的回复!
【解决方案2】:

我假设getcolumns() 中有一个 AJAX 请求,需要一些时间才能完成。此外,尽量避免使用全局变量。

考虑将计算流程更改为异步,导致(未经测试):

async function updateworkbook () {
  let result = await getcolumns();
  // Do something with result
};


function getcolumns() {
  let columns = [];
  // let results = someAjaxRequest;

  for (let i = 0; i < results.length; i++) {
    columns.push(results[i]['COLUMN_NAME'])
  }

  return columns;
};

【讨论】:

  • getcolumns() 没有任何 AJAX 请求,它使用 MYSQL 连接池。但是 getcolumns() 本身在收到 AJAX 请求时会被调用。更新了问题中的代码以提供更好的图片。请看一看!
【解决方案3】:

在我的情况下它工作正常,这里是代码: 这是输出:

您发布的代码没有任何问题。您可能遇到了计时问题[cmets 中建议的异步操作]

【讨论】:

    猜你喜欢
    • 2021-09-19
    • 2014-03-24
    • 1970-01-01
    • 2021-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-10
    • 2019-05-27
    相关资源
    最近更新 更多