我有一個函式,里面有一個 api 呼叫。該函式使用遞回獲取所有檔案夾、檔案夾內的子檔案夾和檔案路徑。這個想法是將所有路徑存盤在一個陣列中,以便稍后處理以創建樹視圖 JSON。通過這種方法,我能夠獲得所有路徑。
public componentDidMount(){
let upperArray: any[] = [];
this.getFiles("/sites/spfxsite/TestLib", upperArray);
// Process the upperArray once last recursion call is completed.
}
public getFiles(folderUrl: string, upperArray: any[]): any {
sp.web.getFolderByServerRelativeUrl(folderUrl)
.expand("Folders, Files").get().then((r: any) => {
r.Files.forEach(item => {
if (item.ServerRelativeUrl.indexOf("Forms") == -1) {
console.log(item.ServerRelativeUrl);
upperArray.push(item.ServerRelativeUrl);
}
})
r.Folders.forEach(item => {
if (item.ServerRelativeUrl.indexOf("Forms") == -1) {
console.log(item.ServerRelativeUrl);
upperArray.push(item.ServerRelativeUrl);
this.getFiles(item.ServerRelativeUrl, upperArray);
}
})
});
}
問題是代碼在所有遞回呼叫完成之前移動到處理 upperArray。我如何等待所有遞回呼叫完成并最終處理 upperArray。
關于 api 呼叫的一點:該呼叫使用 PNP Js 從 SharePoint 庫中獲取所有檔案和檔案夾。
我正在使用 React Js 和 Typescript 進行開發。檔案擴展名是 .tsx
uj5u.com熱心網友回復:
在我看來,其中涉及到承諾?如果是這種情況,您可以嘗試定義一個臨時陣列并推送到該陣列,將其傳遞給另一個then或finally然后推送到upperArray.
可能有用嗎?
域名
uj5u.com熱心網友回復:
那是因為您正在呼叫本質上是異步的函式,但是以同步方式呼叫它。所以你的函式呼叫在異步位開始之前就回傳了。
使用async/await. 它使您的代碼更清晰、更簡單,如下所示:
public async componentDidMount() {
let upperArray: any[] = [];
await this.getFiles("/sites/spfxsite/TestLib", upperArray);
// Process the upperArray once last recursion call is completed.
}
public async getFiles(folderUrl: string, upperArray: any[]): any {
const res = await sp.web
.getFolderByServerRelativeUrl(folderUrl)
.expand("Folders, Files")
.get();
const isWanted = item => item.ServerRelativeUrl.indexOf("Forms") == -1;
for (const file of res.Files.filter(isWanted)) {
upperArray.push(file.ServerRelativeUrl);
}
for (const folder of res.Folders.filter(isWanted)) {
upperArray.push(folder.ServerRelativeUrl);
this.getFiles(folder.ServerRelativeUrl, upperArray);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/366086.html
標籤:javascript 反应 打字稿 接口 休息
下一篇:我如何數數表格中的字母
