首页 > 解决方案 > 试图让函数返回带有推送数据的 arr,但由于某种原因它没有在那里返回它

问题描述

在这里,我需要主索引文件中的 sql 为数据库播种并检查 sql 查询是否返回

// require sql connection from main index
const connection = require('./index');


async function tow() {
    let arr = []; 

    let one  = await connection.query("Select name FROM department", (err, res) => {
        if (err) throw err;
        // console.log(res);
        console.log('1'arr);
        for (let i = 0; i < res.length; i++) {
            // pushing to the array here 
            arr.push(res[i].name);
        }
        console.log('2',arr);

    });
    console.log('3',arr);
    return one;

}

// I want this function to return array with the pushed elements 
tow();



标签: javascriptmysqlsqlnode.js

解决方案


您需要返回 arr。此外,您将 promise 样式与异步的回调样式混合在一起,您可以做任何一种,但不能混合使用。尝试这样的事情。

如果 connection.query 返回一个承诺:

async function tow() {
  let arr = []; 
  let one  = await connection.query("Select name FROM department").then(res => {
    // console.log(res);
    console.log('1', arr);
    for (let i = 0; i < res.length; i++) {
        // pushing to the array here 
        arr.push(res[i].name);
    }
    console.log('2',arr);
    return arr; // need to return arr

},
err => console.error(err));
console.log('3',arr);
return one;  
}

tow().then(res => console.log('result', res));

在您的情况下,connection.query需要回调函数,您可以将回调转换为这样的承诺。

function tow() {
  return new Promise((resolve, reject) => {
    let arr = []; 
    connection.query("Select name FROM department", (err, res) => {
      if (err) reject();
      // console.log(res);
      console.log('1', arr);
      for (let i = 0; i < res.length; i++) {
          // pushing to the array here 
          arr.push(res[i].name);
      }
      console.log('2',arr);
      resolve(arr);
    });
  })
}

// I want this function to return array with the pushed elements 
tow().then(res => console.log('result', res));

这是一个codeSandbox

编辑乐观-volhard-hdwqt


推荐阅读