如何从函数返回JavaScript中的数组?

时间:2019-05-03 17:41:30

标签: javascript mysql node.js

我一直在努力获取一个输出数组的函数,但是我似乎没有做任何让我返回数组或在函数外部访问数组的事情。

我正在使用node.js和mysql,并试图提取行数据,对其进行修改,然后将其放入数组中。我似乎能够将其放入数组中,因为在函数中,我可以console.log记录将数组设置为的变量,并得到所需的内容。但是我无法将其排除在阵列之外。起初,我使用forEach(),但后来改用map()

目前这是我在的位置

let sql = "SELECT invoice FROM subscriptions";
myFunction = () => {
  con.query(sql, (err, rows) => {
    if (err) throw err;
    var newArray = rows.map((row) => {
      return row.invoice;
    })
    console.log(newArray)
  })
}
myFunction();

如果我将console.log(newArray)更改为return newArray,似乎没有证据表明这可以满足我的需求。

我也尝试过在函数外部定义变量,然后将newArray设置为函数外部的变量:

let sql = "SELECT invoice FROM subscriptions";
myArray = []
myFunction = () => {
  con.query(sql, (err, rows) => {
    if (err) throw err;
    var newArray = rows.map((row) => {
      return row.invoice;
    })
    myArray = newArray
  })
}
myFunction();
console.log(myArray)

这只会导致[]

在此代码中,rows从订阅表中返回发票编号。结果是:

[ '23480-13',
  '23354-14',
  '23728-14',
  '23614-16',
  '16132-14',
  ... more results ]

因此该功能内的console.log似乎是正确的。但是,据我所知,如果我尝试返回newArray,则该函数未返回任何内容。

这似乎是一个简单的问题,但是我已经被困了几个小时了。如何创建一个函数,该函数将返回可以在新函数中使用的数组?

2 个答案:

答案 0 :(得分:3)

这是回调驱动的代码,因此您必须提供一个回调函数才能正确链接:

function myFunction(cb) {
  // Supply your query directly to query() so you don't accidentally
  // send the wrong query by using an incorrect or undefined variable.
  con.query("SELECT invoice FROM subscriptions", (err, rows) => {
    // NOTE: This function runs at some point in the unspecified future,
    //       but you can request a callback when it's done.
    if (err) throw err;

    let newArray = rows.map((row) => {
      return row.invoice;
    })

    cb(newArray);
  })
}

myFunction(myArray => {
  console.log(myArray);
});

没有正确的排序,JavaScript代码将无法在正确的时间运行。

请注意,使用Promises可以大大简化此类代码,因为您基本上可以这样做:

let myArray = await con.query(...);

答案 1 :(得分:1)

您可以使用@tadman建议的回调,但我建议您使用Promise。使用 import pandas as pd /* Convert the date column to Datetime format */ data['DATE'] = pd.to_datetime(data['DATE']) /* Create mask for the required condition */ mask = data['DATE'] <= '31-12-2018' /* apply mask to the data */ data = data.loc[mask] 允许其他功能使用await调用此功能。

承诺版本:

Promise

如果您正在使用其他功能,则可以使用await来调用function myFunction() { return new Promise( (resolve, reject) => { con.query("SELECT invoice FROM subscriptions", (err, rows) => { if (err) { reject(err); } resolve(rows.map(row => row.invoice)); }) } ); } myFunction().then(myArray => { console.log(myArray); });

myFunction