使用foreach,foreach内部的typescript异步函数,调用另一个异步函数

时间:2018-03-27 14:18:12

标签: typescript asynchronous sharepoint foreach

最近我偶然发现了异步功能的问题。

我正在使用2个函数,它们都是异步的。 问题是返回值是一个承诺, 因为我不能在foeach循环中等待它。 我试过让这两个foreach异步,但这不起作用 因为它给我提供了伪造的数据。

SHOW TAG VALUES FROM "exdemon_analysis" WITH KEY = "analyzed_metric.attributes.$owner"

功能2

private getAllProperties = async (props?: IPageDetailsProps) => {
props = props || this.props;
let web = new Web(props.context.pageContext.web.absoluteUrl);
let id = 2;
let pageProps = await web.lists.getByTitle("Site Pages").items.filter(`Id eq '${id}'`).get();
let fieldProps = await web.lists.getByTitle("Site Pages").fields.filter(`Group eq 'Template Columns' or InternalName eq 'Title' or InternalName eq 'Created' or InternalName eq 'Author' or InternalName eq 'Modified' or InternalName eq 'Editor'`).get();
let regionalSettings = await web.regionalSettings.get();
let fieldsList: Array<any> = [];
let obj = JSON.parse(props.fields.toString());

fieldProps.forEach(value => {
  obj.forEach(field => {
    if (field === value.InternalName) {
      let item: any = {};
      item.title = value.Title;
      item.internalName = value.InternalName;
      item.typeAsString = value.TypeAsString;
      if (item.typeAsString === "DateTime") {
        let formatOptions: Intl.DateTimeFormatOptions = {};
        formatOptions.hour12 = !regionalSettings.Time24;
        let date = new Date(pageProps[0][field]);
        item.Data = date.toLocaleString(regionalSettings.LocaleId, formatOptions);
      }
      if (item.typeAsString === "Text" || item.typeAsString === "Note") {
        let text = pageProps[0][field];
        item.Data = text;
      }
      if (item.typeAsString === "User") {
        let personId = field + "Id";
        let user = this.getPersonFromId(pageProps[0][personId])
        item.Data = user;
       // Problem is here, by the fact that the return value from 
       // getPersonFromId is a promise, 
       // since i cant await for it here.
       // I have tried making the both foreach async, but that does not work 
       // as it feeds me bogus data.
       // What i want to do is not do anything until i have an answer
      }
      if (item.typeAsString === "TaxonomyFieldType") {
        item.Data = pageProps[0][field].Label;
      }
      if (item.typeAsString === "TaxonomyFieldTypeMulti") {
        let items = pageProps[0][field];
        let terms = "";
        items.forEach(element => {
          terms += element.Label + "   ";
        });
        item.Data = terms;
      }
      fieldsList.push(item);
    }
  });
});

}

1 个答案:

答案 0 :(得分:1)

异步函数与forEach不兼容,因为forEach没有机制等待异步回调在任何给定的迭代中完成。您需要执行以下操作之一: