【发布时间】:2020-10-14 11:16:13
【问题描述】:
我被困在async地狱:
function convertToDomainUsers(dbUsers: Array<UserDB>): Array<UserDomain> {
// iterate each DB user and convert them to domain user types
const domainUsers: Array<UserDomain> = dbUsers.map( async (dbUser: UserDB) => {
// first convert the DB user to a Domain User
const domainUser: UserDomain = newUserDomainModel(dbUser);
// Now we need to get their user links from the DB
const dbUserLinks: Array<UserLinkDB> = await findDBUserLinks(dbUser.user_id);
// convert their user links to Domain user links
const domainUserLinks: Array<UserLinkDomain> = convertToUserLinks(dbUserLinks);
// now merry up the domain user links to the domain user
domainUser.links = domainUserLinks;
return domainUser;
});
return domainUsers;
}
function newUserDomainModel(user: UserDB): UserDomain {
const domainUser: UserDomain = {
username: user.user_username,
firstName: user.user_name_first,
lastName: user.user_name_last
};
return domainUser;
}
async function findDBUserLinks(userId: bigint): Promise<Array<UserLinkDB>> {
const dbUserLinks: Array<UserLinkDB> = await getUserLinks(userId);
return dbUserLinks;
}
async function getUserLinks(id: bigint): Promise<Array<UserLinkDB>> {
setDB();
await client.connect();
const query = `
select
link_url,
social_type_id
from user_links
WHERE user_id = ${id}`;
const res = await client.query(query);
const links: Array<UserLinkDB> = res.rows;
return Promise.resolve(links);
}
错误(发生在convertToDomainUsers 函数中的const domainUsers:):
TS2322: Type 'Promise<UserDomain>[]' is not assignable to type 'UserDomain[]'. Type 'Promise<UserDomain>' is missing the following properties from type 'UserDomain': username, firstName, lastName, fullName, and 6 more
添加 cmets 是为了使此堆栈帖子更易于理解。我通常不写 cmets,它们很笨拙。
【问题讨论】:
-
UserrDomain在“用户”的末尾有 2 个“r”是一个错误吗?我不知道这是否是实际问题,但它似乎是错误的。 -
@zero298 实际上是
Array<Promise<UserDomain>>,它是一个承诺数组,而不是一个数组的承诺。 -
这仍然比嵌套 6 深的
.then()回调要少得多。 -
@PositiveGuy 是的,回调是异步的,这就是使它成为一系列承诺的原因。参见例如stackoverflow.com/q/40140149/3001761,你不能只是等待数组 .map 返回。
-
await Promise.all(dbUsers.map(...) 我认为应该这样做
标签: javascript node.js asynchronous