Javascript 在回调函数完成后执行代码

Javascript 在回调函数完成后执行代码,javascript,typescript,Javascript,Typescript,我想在此代码文件中的所有回调完成后执行addFormLayoutSectionFieldsView()函数 webPart._getListDataSources(xComp).then((response) => { let dItems: List_Item[] = response.value; dItems.forEach((item: List_Item) => { dataSourceId = i

我想在此代码文件中的所有回调完成后执行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);```

         
webPart.\u getListDataSources(xComp).然后((响应)=>{
let-dItems:List_Item[]=response.value;
数据项forEach((项:列表项)=>{
数据源Id=项目[“Id”];
webPart.\u GetListDataSourceFieldData(dataSourceId)。然后((响应)=>{
let pItems:List_Item[]=response.value;
pItems.forEach((项目:列表项目)=>{
AddSectionFieldHtml1+=`${item[“Id”]}`;
console.log(AddSectionFieldHtml1);
});
});
});
});
webPart.addFormLayoutSectionFieldsView(FormLayoutSectionId)```

为了解决这个问题,我一直使用
Promise.all
map

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);
          )```

这将把
1
2
变成承诺,然后当两者都解决时,控制台将登录到。

那么为什么不将该代码放在最内层
的最后一条语句之后呢(
callback?我试过了,AddSectionFieldHtml1返回空字符串,即使它应该有很多行,但根据您提供的代码,它不应该有很多行。如果它应该是循环中所有数据的收集器,请参见上面的
webPart.\u getListDataSources
put
让AddSectionFieldHtml1='
pItems.forEach
您正在初始化一个全新的
AddSectionFieldHtml1
为未定义,然后为其分配一个字符串。然后当该
forEach
块终止时,该值消失在空气中。因此,如果您执行所有代码,然后尝试访问数据,是的,它将是未定义的(不是空字符串)而不是多行字符串。我声明
AddSectionFieldHtml1
global,以便在
addFormLayoutSectionFieldsView()中使用它
Promise
  .all([1,2].map(Promise.resolve)
  .then(() => console.log('Done with promises!'))