SharePoint Framework & TypeScript и дождитесь завершения всех обещаний, прежде чем вернуться к клиенту
У меня есть вопрос об ожидании разрешения обещаний, прежде чем вернуть значение клиенту.
Я работаю с SharePoint Framework, чтобы получить коллекцию имен списков и библиотек документов из моего списка конфигурации, а затем я использую эти имена (имена списков и библиотек документов), чтобы перезвонить в SharePoint, чтобы получить элементы списка для каждого список и библиотека документов.
Ниже приведен мой код для получения имен списков и библиотек документов, которые я буду использовать для получения элементов списка:
private _getListData(): Promise<ISPLists> {
let listName:string = "SPListDisplayUIConfig";
let currentUrl = this.context.pageContext.web.absoluteUrl + `/_api/web/lists/GetByTitle('`+listName+`')/Items`;
var formatedResponse: ISPLists = { value: [] };
return this.context.spHttpClient.get(currentUrl, SPHttpClient.configurations.v1)
.then((response: SPHttpClientResponse) => {
//Extract the response.json object.
return response.json().then((responseFormated: any) => {
//Evaluate the response.
responseFormated.value.map((object: any, i: number) =>{
var listItems: ListObjects = { value: [] };
var spListItem: ISPList = {
Id: object['ID'],
Title: object['Title'],
DisplayListTitle: object['DisplayListTitle'],
RowCount: object['RowCount'],
SortOrder: object['SortOrder'],
ShowOnHomePage: object['ShowOnHomePage'],
ListType: '',
ListItems: listItems
};
formatedResponse.value.push(spListItem);
});
//Create a local list and store all the this._getListItems(Title) calls into the array, then pass the local array into the Promise.all method to execute each
//method. In the return result (then), extract each list item and store into the spListItem.ListItem property.
let promisesMethods:any = [];
formatedResponse.value.forEach((item:ISPList) => {
let listName:string = item.Title;
promisesMethods.push(this._getListItems(listName));
});
Promise.all(promisesMethods).then((result:any) => {
console.log("Here");
});
console.log("Here 1")
return formatedResponse;
})
})
}
Метод this._getListItems извлекает элементы списка для каждого имени списка.
let promisesMethods:any = [];
formatedResponse.value.forEach((item:ISPList) => {
let listName:string = item.Title;
promisesMethods.push(this._getListItems(listName));
});
Promise.all(promisesMethods).then((result:any) => {
console.log("Here");
});
console.log("Here 1")
Это определение this._getListItems:
private _getListItems(ListName: string): Promise<ListObjects>{
let currentUrl = this.context.pageContext.web.absoluteUrl + `/_api/web/lists/GetByTitle('`+ListName+`')/Items`;
return this.context.spHttpClient.get(currentUrl, SPHttpClient.configurations.v1)
.then((response: SPHttpClientResponse) => {
return response.json().then((responseFormated: any) => {
var formatedResponse: ListObjects = { value: []};
responseFormated.value.map((object: any, i: number) =>{
var spListItem: ListObject = {
Title: object['Title'],
ItemUrl: "",
ItemType: "",
FileType: "",
Id: object['ID']
};
formatedResponse.value.push(spListItem);
});
return formatedResponse;
})
})
}
В приведенном ниже коде console.log("Здесь 1") вызывается перед console.log("Здесь"). Мне нужно получить все элементы списка для каждого списка и библиотеки, прежде чем я верну результаты обратно клиенту.
let promisesMethods:any = [];
formatedResponse.value.forEach((item:ISPList) => {
let listName:string = item.Title;
promisesMethods.push(this._getListItems(listName));
});
Promise.all(promisesMethods).then((result:any) => {
console.log("Here");
});
console.log("Here 1")
return formatedResponse;
Спасибо
1 ответ
Просто продолжайте свой код внутри then
блок, а во внешнем блоке вернуть обещание, соответствующее этому then
заблокировать звонящему. Что-то вроде этого:
private _getListData(): Promise<ISPLists> {
let listName:string = "SPListDisplayUIConfig";
let currentUrl = this.context.pageContext.web.absoluteUrl + `/_api/web/lists/GetByTitle('`+listName+`')/Items`;
var formatedResponse: ISPLists = { value: [] };
return this.context.spHttpClient.get(currentUrl, SPHttpClient.configurations.v1)
.then((response: SPHttpClientResponse) => {
//Extract the response.json object.
return response.json().then((responseFormated: any) => {
//Evaluate the response.
responseFormated.value.map((object: any, i: number) =>{
var listItems: ListObjects = { value: [] };
var spListItem: ISPList = {
Id: object['ID'],
Title: object['Title'],
DisplayListTitle: object['DisplayListTitle'],
RowCount: object['RowCount'],
SortOrder: object['SortOrder'],
ShowOnHomePage: object['ShowOnHomePage'],
ListType: '',
ListItems: listItems
};
formatedResponse.value.push(spListItem);
});
//Create a local list and store all the this._getListItems(Title) calls into the array, then pass the local array into the Promise.all method to execute each
//method. In the return result (then), extract each list item and store into the spListItem.ListItem property.
let promisesMethods:any = [];
formatedResponse.value.forEach((item:ISPList) => {
let listName:string = item.Title;
promisesMethods.push(this._getListItems(listName));
});
return Promise.all(promisesMethods).then((result:any) => {
// ^^^^^^
console.log("Here");
// Any more necessary processing
return /* whatever result you want */;
});
})
})
}