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