0

尝试构建一个更复杂的 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: []
  }
]

但现在我的回报是[]

4

1 回答 1

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

看下面,问我问题是否有任何审讯点


操场


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);
})();
于 2021-01-08T09:13:32.463 回答