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 */;
               });
             })
           })
   }
Другие вопросы по тегам