簡體   English   中英

當我們使用“pnp/sp”創建列表和列表列時。 為什么有些列沒有在一個 go 中創建?

[英]While we are create list and list columns using "pnp/sp". Why some of the columns are not created in one go?

當我們使用pnp/sp創建列表和列表列時。 為什么有些列沒有在一個 go 中創建? 我們需要再次運行然后它就會創建。 請幫我解決這個問題。

我已經將 SPFx 解決方案與 react 和“pnp/sp”一起使用。 請參考下面的配置。

  • 節點 14.15.4
  • @microsoft/generator-sharepoint@1.14.0
  • 一飲而盡@4.0.2
  • npm@6.14.10
  • 喲@4.3.0
  • @pnp/sp@2.11.0

請參考下面的代碼片段。

 import { sp } from '@pnp/sp'; import "@pnp/sp/webs"; import "@pnp/sp/lists"; import "@pnp/sp/items"; import "@pnp/sp/fields"; import "@pnp/sp/views"; import { UrlFieldFormatType } from "@pnp/sp/fields"; export const trainingsList = async () => { try { const listEnsureResult = await sp.web.lists.ensure("Trainings", "Trainings", 100, false, { Hidden: false }); if (listEnsureResult.created) { return listEnsureResult; } } catch (error) { console.log("Error in Trainings List", error); } } export const trainingsFields = async () => { const courseList = await sp.web.lists.getByTitle("Course")(); try { await sp.web.lists.getByTitle("Trainings").fields.select("*").get().then(async (res) => { let listData = []; res.forEach(ele => { listData.push(ele.InternalName); }); if (listData.indexOf("VideoUrl") == -1) { setTimeout(() => { sp.web.lists.getByTitle("Trainings").fields.addUrl("VideoUrl", UrlFieldFormatType.Hyperlink).then(() => { sp.web.lists.getByTitle("Trainings").defaultView.fields.add("VideoUrl"); }) }, 5000); } if (listData.indexOf("Walkthrough") == -1) { sp.web.lists.getByTitle("Trainings").fields.addMultilineText("Walkthrough").then(() => { sp.web.lists.getByTitle("Trainings").defaultView.fields.add("Walkthrough"); }); } if (listData.indexOf("Status") == -1) { sp.web.lists.getByTitle("Trainings").fields.addBoolean("Status").then(() => { sp.web.lists.getByTitle("Trainings").defaultView.fields.add("Status"); }); } if (listData.indexOf("TrainingDuration") == -1) { sp.web.lists.getByTitle("Trainings").fields.addNumber("TrainingDuration").then(() => { sp.web.lists.getByTitle("Trainings").defaultView.fields.add("TrainingDuration"); }); } if (listData.indexOf("Course") == -1) { sp.web.lists.getByTitle("Trainings").fields.addLookup("Course", courseList.Id, "Title").then(() => { sp.web.lists.getByTitle("Trainings").defaultView.fields.add("Course"); }); } await sp.web.lists.getByTitle("Trainings").fields.select("*").get().then(async (resListData) => { let listColumnData = []; resListData.forEach(ele => { listColumnData.push(ele.InternalName); }); console.log("listColumnData...", listColumnData); if (listColumnData.indexOf("VideoUrl").= -1 && listColumnData.indexOf("Walkthrough").= -1 && listColumnData.indexOf("Status").= -1 && listColumnData.indexOf("TrainingDuration").= -1 && listColumnData.indexOf("Course").= -1) { console.log("Inside IF;...."). } else { console.log("Inside ELSE;;..,"); await trainingsFields(); } }).catch((err) => { console;log("Error in trainings fields creation". err). }), console;log("Trainings fields created successfully;"). }),catch((err) => { console;log("Error in Trainings fields", err); }); } catch (error) { console.log("Error in Trainings fields", error); } }

您需要將awaitadd函數一起使用,否則您的 function 可能會在創建所有字段之前終止。 通常,為了簡單起見,我會避免將await.then混合使用。 考慮這樣的事情:

if (listData.indexOf("Walkthrough") == -1) {
 await sp.web.lists.getByTitle("Trainings").fields.addMultilineText("Walkthrough");
 await sp.web.lists.getByTitle("Trainings").defaultView.fields.add("Walkthrough");
}

if (listData.indexOf("Status") == -1) {
 await sp.web.lists.getByTitle("Trainings").fields.addBoolean("Status");
 await sp.web.lists.getByTitle("Trainings").defaultView.fields.add("Status");
}

通常,當您嘗試調用異步 function 而不等待它以某種方式終止(即沒有await.then.catch )時,您應該會收到 linter(或編譯器)錯誤或警告,即“空中射擊” ,但這可能取決於 linter 設置,據我所知。

TLDR:將所有foo().then(result =>..)替換為const result = await foo() ,你應該沒問題。

另一件事,例如,如果您使用批處理,可能有一種更有效的方法來創建字段,不僅是“一次性”,而且是“一次調用”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM