我有一個嵌套的Person物件陣列。
每個Person物件都有一個強制性的name. 每個Person都可以選擇有一個children包含其他Person物件陣列的欄位(也有一個子欄位 - 因此家譜的“深度”基本上可以永遠持續下去。)
如果沒有孩子,孩子欄位將只是一個空陣列 []。
例如
const family_name = "The Numbers";
const family = [{
name: "1",
children: [],
},
{
name: "2",
children: [{
name: "2-1",
children: [{
name: "2-1-1",
children: [],
}, ],
},
{
name: "2-2",
children: [],
}
],
},
{
name: "3",
children: [{
name: "3-1",
children: [],
}, ],
},
]
我需要在“孩子”之前發布“父母”。當我 POST a 時Person,我會id在response.data. 這id需要在直接子項的 POST 中用作 a,parent_id以便子項與父項相關聯。
最頂層的Person將需要讓他們parent_id成為family_name.
每個“級別”都需要異步發布,因為我的后端需要保留順序。(注意:Person在客戶端計算 的順序并將該值傳遞給后端并不是解決方案,因為Person實際上是插入順序很重要的 MPTT 模型。)
例如,1然后2再3
例如2然后2-1然后 2-2。
但是,嵌套的Persons 可以同步發布。例如,一旦 POSTing2回傳 201 回應,它的“兄弟”3和它的“子”2-1可以同時發布。
如何以最佳方式Person在嵌套陣列中發布所有s 以便保留順序?請注意,我正在使用 axios。
編輯:這是一些偽代碼:
function postPersons(persons, parent_id) {
// Async POST all objects in persons
// e.g. POST 1 then 2 then 3 to family_name
// For each successful POST, if person has children,
// async POST those children to that person
// e.g. Once POST to 2 resolves, POST 2-1 then 2-2 to 2
// e.g. Once POST to 3 resolves, POST 3-1 to 3
// Repeat for all successful POSTs
// e.g. Once POST to 2-1 resolves, POST 2-1-1 to 2-1
}
postPersons(family, family_name)
uj5u.com熱心網友回復:
我建議不要將async/await用于順序回圈,而是建議使用同步回圈并分別累積兩件事:
- 順序處理的孩子的承諾(見這里或那里)
- 所有遞回呼叫的一系列承諾,最終將被
Promise.all'd
這確保了正確的順序以及錯誤的立即傳播。
所以代碼看起來像
function postPersons(persons, parent_id) {
const results = [];
let chain = Promise.resolve();
for (const person of persons) {
chain = chain.then(() =>
postSinglePerson(person, parent_id)
);
results.push(chain.then(result =>
postPersons(person.children, result.id)
));
}
return Promise.all(results);
}
postPersons(family, family_name).then(() => console.log('Done'), console.error);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/321723.html
標籤:javascript 表现 异步 异步等待 公理
