【问题标题】:Trying return an array built from a foreach loop of a returned mysql query [duplicate]尝试返回从返回的mysql查询的foreach循环构建的数组[重复]
【发布时间】:2021-01-08 09:03:58
【问题描述】:

尝试构建更复杂的 MySQL 查询返回,但返回不等待 forEach 循环完成。

export const Query = (query: string, values?: Array<string | number>) => {
    return new Promise<Array<any>>((resolve, reject) => {
        pool.query(query, values, (err, results) => {
            if(err) reject(err);
            return resolve(results);
        });
    });
};
const getUsersChats = async(userid: number) => {
    let chats = await Query('SELECT * FROM users_chats u JOIN direct_chats d ON d.id = u.chatid WHERE u.userid = ?', [userid]);
    //console.log(chats);
    let buildReturn: any = [];
    const build = async() => {
        chats.forEach(async(chat) => {
            let buildInnerObject = {};
            let lastMsg = await Query('SELECT * FROM messages WHERE chatid = ? ORDER BY created DESC LIMIT 1', [chat.id]);
            buildInnerObject = {...chat, lastMSG: lastMsg}
            buildReturn.push(buildInnerObject);
        });
    }
    await build();
    console.log(buildReturn)
    return buildReturn;
}

我正在寻找类似的回报:

  {
    id: 12,
    userid: 28,
    chatid: 12,
    created: 2021-01-05T23:14:03.000Z,
    userid_1: 28,
    userid_2: 31,
    title: 'Title',
    lastMSG: [ [RowDataPacket] ]
  },
  {
    id: 13,
    userid: 28,
    chatid: 13,
    created: 2021-01-05T23:18:40.000Z,
    userid_1: 28,
    userid_2: 33,
    title: 'Title'
    lastMSG: []
  }
]

但现在我的回报是[]

【问题讨论】:

  • 你永远不会调用build.... 所以它的代码根本没有执行。此外,对每个 chat.id 进行单独查询似乎效率很低。为什么不进行一次查询,将它们全部选中?
  • 我的错误我忘了发布更新的常量。即使调用 build 时,我的 return 也不会等待。是的,我考虑过这一点,但我不确定如何编写一个查询来选择特定聊天 ID 的最新消息。

标签: javascript asynchronous promise async-await mysqljs


【解决方案1】:
  1. 您没有调用build 函数来获取值。
  2. 如果您不await 查询消息,您将无法从您的函数中返回它。
  3. 您应该正确输入数据,以便更易于使用和发现错误

看看下面的内容,问我问题是否有任何疑问


playground


function Query<T>(_query: string, _values?: Array<string | number>): Promise<T[]> {
    return new Promise((resolve) => {
      setTimeout(() => {
        resolve([{
          id: 'foo',
        }] as unknown as T[]);
      }, 50);
    });
};

interface Chat {
  id: string;
}

interface Messages {
  example: string;
}

type MyExtendedChat = Chat & {
  lastMSG: Messages[];
};

const getUsersChats = async(userid: number): Promise<MyExtendedChat[]> => {
    const chats: Chat[] = await Query<Chat>(
      'SELECT * FROM users_chats ...',
      [
        userid,
      ],
    );

    const buildReturn: MyExtendedChat[] = await Promise.all(chats.map(async(chat) => {
      const lastMsg: Messages[] = await Query<Messages>(
        'SELECT * FROM messages ...',
        [
          chat.id,
        ],
      );

      return {
        ...chat,
        lastMSG: lastMsg,
      };
    }));

    console.log(buildReturn);

    return buildReturn;
}

(async() => {
  await getUsersChats(42);
})();

【讨论】:

    猜你喜欢
    • 2020-10-13
    • 2011-02-21
    • 1970-01-01
    • 2018-10-08
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    相关资源
    最近更新 更多