答应pnp / sp

时间:2019-02-03 14:52:19

标签: javascript typescript promise

我正在SPFX中构建应用程序定制程序,并且我正在使用pnp / sp从Sharepoint列表中获取数据-到目前为止,一切都很容易。我已经弄清楚了这样的代码,但是它只是返回[object promise]这是我的代码,任何帮助都将是很棒的。

我正在这样调用函数:

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;

}

任何帮助将不胜感激,我知道我快到了:)谢谢

2 个答案:

答案 0 :(得分:0)

我认为您的GetSharePointData返回了Promise,因为它有async declaration,因此您需要异步执行代码并等待结果。 代替:

public emailAddressGetter = this.GetSharePointData();

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

尝试:

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

答案 1 :(得分:0)

首先修复代码的类型注释。通过指定空虚类型而不是利用推理来抑制语言存在的错误,从而完全克服了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设置为正确的方法(根据顺便说一句,BTW都是该属性的糟糕名称)取决于上下文,但这是您可以做的。

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

但这可能很糟糕,并且不必要的不​​可预测的操作取决于您要执行的操作。