【问题标题】:How can I return an array in javascript from a function? [duplicate]如何从函数返回 javascript 中的数组? [复制]
【发布时间】:2019-05-03 17:41:29
【问题描述】:

我一直在努力让一个函数输出一个数组,但我所做的似乎没有让我返回一个数组或访问函数之外的数组。

我正在使用 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,据我所知,该函数不会返回任何内容。

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

【问题讨论】:

  • 大概是let sql而不是et sql
  • 我想这解决了同样的问题,但我也不知道这是否会回答我的问题,我是否会遇到它。所以我想问题是一样的,我一直在寻找的关于如何解决问题的东西并不是我完全理解的。也就是说,了解那篇文章将有助于向前发展。

标签: javascript mysql node.js


【解决方案1】:

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

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(...);

【讨论】:

  • 是的!非常感谢您抽出宝贵时间。这只是我没有得到的那一块。再次感谢您。
【解决方案2】:

您可以使用@tadman 建议的回调,但我建议您使用Promise。使用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);
});

如果您在另一个函数中,则可以使用 await 调用 myFunction

async function getData() {
  myArray = await myFunction();
  console.log(myArray);
  return myArray;
}

【讨论】:

  • 很好的例子,但这里有两点值得注意。首先,许多库同时支持回调和承诺调用方法。其次,您通常可以promisify 一个回调函数来代替它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-30
  • 2014-08-29
  • 2019-11-05
  • 2011-08-11
  • 2014-11-20
  • 1970-01-01
  • 2016-10-16
相关资源
最近更新 更多