簡體   English   中英

回調函數完成后執行代碼

[英]execute code after callback function finish

我想在此代碼 Ts 文件中的所有回調完成后執行 addFormLayoutSectionFieldsView() 函數

webPart._getListDataSources(xComp).then((response) => {
            let dItems: List_Item[] = response.value;
            dItems.forEach((item: List_Item) => {
              dataSourceId = item["Id"];
              webPart._getListDataSourceFieldsData(dataSourceId).then((response) => {
                let pItems: List_Item[] = response.value;
                pItems.forEach((item: List_Item) => {
                  AddSectionFieldHtml1 += `<option value= "${item["Id"]}"> ${item["Id"]} </option>`;
                  console.log(AddSectionFieldHtml1);
                });
              });
            });
          });
            
webPart.addFormLayoutSectionFieldsView(FormLayoutSectionId);```

         

為了解決這個問題,我一直在使用Promise.allmap

webPart._getListDataSources(xComp).then((response) => {
            Promise.all(response.value.map((item: List_Item) => {
              dataSourceId = item["Id"];
              return webPart._getListDataSourceFieldsData(dataSourceId).then((response) => {
                let pItems: List_Item[] = response.value;
                pItems.forEach((item: List_Item) => {
                  AddSectionFieldHtml1 += `<option value= "${item["Id"]}"> ${item["Id"]} </option>`;
                  console.log(AddSectionFieldHtml1);
                });
              });
            });
          })).then(() =>             
            webPart.addFormLayoutSectionFieldsView(FormLayoutSectionId);
          )```

因此,這里不是僅僅迭代所有項目並執行新的異步調用,而是將每個項目變成一個承諾,使用Promise.all收集該承諾數組,然后當所有承諾完成后,執行傳遞給Promise.all(...).then的回調Promise.all(...).then .

例如,

Promise
  .all([1,2].map(Promise.resolve)
  .then(() => console.log('Done with promises!'))

這會將12變成 promise,然后當兩者都解決時,控制台將被登錄。

暫無
暫無

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

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