Обещаю неприятности с pnp / sp - PullRequest
0 голосов
/ 03 февраля 2019

Я создаю настройщик приложений в 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;

}

любая помощь будет оценена, я знаю, что я почти там :) спасибо, ребята

Ответы [ 2 ]

0 голосов
/ 03 февраля 2019

Сначала исправьте аннотации типа вашего кода.Вы полностью побеждаете смысл 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);
 }

Но это может быть ужасно и излишне непредсказуемо в зависимости от того, что вы пытаетесьделать.

0 голосов
/ 03 февраля 2019

Я думаю, что ваш GetSharePointData возвращает Promise, потому что он имеет async declaration, поэтому вам нужно выполнить код асинхронно и дождаться результата.Вместо:

public emailAddressGetter = this.GetSharePointData();

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

Попробуйте:

this.GetSharePointData()
  .then(res => {
    // res here is myVar
    ${escape(res.toString())};
  });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...