承诺pnp / sp的麻烦



我正在SPFX中构建一个应用程序定制器,并且正在使用pnp/sp从Sharepoint列表中获取数据 - 到目前为止都很容易。我已经想出了这样的代码,但它只是返回 [对象承诺] 这是我的代码,任何帮助都会很棒。

我像这样调用函数:

public emailAddressGetter = this.GetSharePointData();

我正在尝试像这样显示输出:

${escape(this.emailAddressGetter.toString())}

这就是我正在执行的承诺:

  private async GetSharePointData(): Promise<any>
{ 
    let myVar : string;
    var resultData: any = await sp.web.lists
                               .getByTitle('Emails')
                               .items                                     
                               .select('EmailAddress')
                               .getById(99)
                               .get().then((r => {
   myVar = r.EmailAddress;
                         }));                            
    console.log(myVar);
    return myVar;
}

任何帮助将不胜感激,我知道我几乎在那里:)谢谢大家

我认为您的GetSharePointData返回一个 Promise,因为它具有 async declaration ,因此您需要异步执行代码并等待结果。而不是:

public emailAddressGetter = this.GetSharePointData();
${escape(this.emailAddressGetter.toString())}

尝试:

this.GetSharePointData()
  .then(res => {
    // res here is myVar
    ${escape(res.toString())};
  });
首先修复

代码的类型注释。你完全违背了TypeScript的观点,通过指定空洞的类型而不是利用推理来抑制语言存在的错误。这不是Java。

async GetSharePointData() { // return type is inferred as `Promise<string>`
    const result = await sp.web.lists // the `any` you had here was worse than useless. 
                           .getByTitle('Emails')
                           .items                                     
                           .select('EmailAddress')
                           .getById(99)
                           .get();
     const emailAddress= result.emailAddress;
     console.log(emailAddress);
     return emailAddress;
}

现在进入异步函数和承诺。async函数或方法始终返回承诺。将调用此类函数的结果直接分配给属性或变量将始终导致您描述的行为

GetSharePointData().toString() === "[object Promise]"

将属性emailAddressGetter(顺便说一句,无论哪种方式,该属性的名称都是一个糟糕的名称(设置为承诺最终解析的电子邮件地址的正确方法取决于上下文,但您可以执行以下操作。

constructor() {
    this.emailAddressPromise = this.GetSharePointData();
    this.emailAddressPromise.then(emailAddress => this.emailAddress = emailAddress);
 }

但这可能是可怕的和不必要的不可预测的,这取决于你想做什么。

最新更新