3 回答

TA貢獻1842條經驗 獲得超22個贊
如果您想并行運行請求,則在調用 .get() 之前等待它們都完成,您可以嘗試使用以下代碼Promise.all:
// we wait for both promises to finish
await Promise.all([contextSeeder.withList(), contextSeeder.withUser()]);
// they're both finished so we can get it now
let props = contextSeeder.get();

TA貢獻1858條經驗 獲得超8個贊
以下內容一一開始異步檢索,然后使用Promise.all. 最后,將結果解構,然后添加到要返回的對象中。
我認為這是對您的代碼的簡化,因為中間狀態不會公開共享。
我會重命名ListContextSeeder并UserContextSeeder成為更慣用的東西。大寫的名稱通常保留給構造函數。
export default async function seedContext({ serverContext, listId, userId }) {
const p1 = ListContextSeeder(serverContext, listId)
const p2 = UserContextSeeder(serverContext, userId)
const [list, user] = await Promise.all([p1, p2])
return { list, user }
}

TA貢獻1784條經驗 獲得超9個贊
出于此答案的目的,我將忽略您沒有使用 userId 或 listId 的事實。
您可以使用以下內容簡化代碼:
export default class ContextSeeder {
context = {};
serverContext;
constructor(serverContext = undefined) {
this.serverContext = serverContext;
}
withList = async (listId = undefined) => {
let seededUserContext = await UserContextSeeder(this.serverContext);
this.context = {...this.context, user: seededUserContext}
// Not needed unless you still want to chain them
// return this;
}
withUser = async (userId = undefined) => {
let seededListContext = await ListContextSeeder(context);
this.context = {...this.context, list: seededListContext}
// Not needed unless you still want to chain them
// return this;
}
get = () => {
return this.context;
}
}
然后,您可以使用 Promise.all() 等待兩者的解決:
// They now run in "parallel"
await Promise.all([contextSeeder.withList(), contextSeeder.withUser());
let props = contexSeeder.get();
更新
根據下面 Ben Aston 的回答,另一個改進是將此行為封裝在另一個內部方法中,傳遞一個中間上下文,并且只有在兩個調用都完成后才設置實際上下文。
export default class ContextSeeder {
context = {};
serverContext;
constructor(serverContext = undefined) {
this.serverContext = serverContext;
}
withList = async (listId = undefined, intermediateContext) => {
let seededUserContext = await UserContextSeeder(this.serverContext);
// No spread operator needed, just set the property
intermediateContext.user = seededUserContext;
// Not needed unless you still want to chain them
// return this;
};
withUser = async (userId = undefined, intermediateContext) => {
let seededListContext = await ListContextSeeder(context);
// No spread operator needed, just set the property
intermediateContext.list = seededListContext;
// Not needed unless you still want to chain them
// return this;
};
seedContext = async (userId, listId) => {
let intermediateContext = {};
await Promise.all([
withUser(userId, intermediateContext),
withList(listId, intermediateContext)
]);
this.context = intermediateContext;
}
get = () => {
return this.context;
};
}
然后,只需等待 seedContext:
await contextSeeder.seedContext(userId, listId);
let props = contextSeeder.get();
添加回答
舉報