ES6 и переменная область действия внутри обещания

Не уверен, что мне здесь не хватает.

Мне нужно получить выводdata вthis.contact, Прямо сейчас я использую статическую переменную класса, но это кажется грязным, чтобы сделать это.

export class contactEdit {
  static t; // static class var
  constructor() {
    this.id = null;
    this.contact = null;
    contactEdit.t = this;
  }

  activate(id) {
    this.id = id;
    let contact = this.contact; // scoped version of class var
    return dpd.contacts.get(id).then(function(data) {
      console.log(data);
      contactEdit.t.contact = data; // this works
      contact = data; // this doesn't
    });
  }
}

Обычно я бы создалvar contact внутриactivate() функция (она работает в консоли Chrome), но это не похоже на работу в ES6.

Консоль Chrome:

var c = null;
undefined
c;
null
dpd.contacts.get('a415fdc8f5a7184d').then(function(data) {
      c = data;
    });
Object {}fail: (n)then: (e,t)__proto__: Object
c;
Object {firstName: "John", lastName: "Doe", id: "a415fdc8f5a7184d"}
 Bergi26 июл. 2016 г., 17:16
static t; это не ES6. Вы используете машинопись или что-то?
 Andrew Grothe26 июл. 2016 г., 20:57
@Bergi Aurelia нужно свойство, чтобы связать с.activate Метод возвращает обещание, так что экран ожидает данных перед загрузкой. После загрузки привязка нуждается в свойстве. Или я так понимаю до сих пор.
 Bergi26 июл. 2016 г., 17:18
В любом случае вы не должны хранить результаты обещаний как свойства экземпляра. Сохраните обещание, если вам нужно.
 Andrew Grothe26 июл. 2016 г., 20:37
@ Берги, не машинопись. Хотя некоторые экспериментальные функции включены.
 trincot26 июл. 2016 г., 17:03
Вы не просто хотелиthis.contact = data; вместоcontact = data;?
 Bergi26 июл. 2016 г., 21:02
@agrothe: ОК, это всегда зависит от того, как вы используете свойство, конечно. Если Аурелия не может давать обещания напрямую, она может вам понадобиться, но всегда имейте в виду, что это может бытьundefined когда обещание не выполнено.
 Andrew Grothe26 июл. 2016 г., 20:36
@ trincot нет,this внутри обещание больше не относится к классу. Это была моя первая попытка :)

Ответы на вопрос(2)

Решение Вопроса

Вам нужно сделать две вещи. Во-первых, используйте функцию со стрелкой, а во-вторых, используйте `this.contact = data;

activate(id) {
  this.id = id;
  return dpd.contacts.get(id).then(data => {
    console.log(data);
    this.contact = data;
  });
}

Вы используете функцию стрелки, потому что она имеет дело с JavaScript "thismsgstr "проблема, где это относится к лексической области действия функции, а не к объекту, в котором вы находитесь в данный момент. Использование функции стрелки гарантирует, чтоthis вне функции стрелки так же, какthis внутри функции стрелки.

Вам нужно использоватьthis.contact так какcontact это свойство экземпляра класса.

 Andrew Grothe26 июл. 2016 г., 20:39
@ MatthewJamesDavis Согласен, функция стрелки делает свое дело.
 Andrew Grothe26 июл. 2016 г., 20:41
@AshleyGrant, возможно, вы могли бы добавить предложение или два о том, почему функция стрелки исправляет это? Я собираюсь почитать об этом, но я помогу другим, я уверен.
 Matthew James Davis26 июл. 2016 г., 20:18
лучший ответ на все переполнения стека сегодня
 Andrew Grothe26 июл. 2016 г., 20:52
Для тех, кто интересуется деталями, см. Лексический раздел здесь:developer.mozilla.org/en/docs/Web/JavaScript/Reference/...

Проблема в том, чтоcontact = data; обновит значение местногоcontact переменная, но не изменит значениеthis.contact, Вам необходимо обновитьcontact вместо этого свяжитесь с собственностью. Проблема в том, что у вас нет доступа кthis внутри ядра вашей функции.

Есть разные способы решить эту проблему.

1- Вы можете сохранить контекст активации (this) в переменную при закрытииactivate так что вы можете получить к нему доступ в ядреthen.

activate(id) {
    this.id = id;
    let that = this;
    return dpd.contacts.get(id).then(function(data) {
      console.log(data);
      that.contact = data;
    });
  }

2- Вы можете привязать функцию кthis так что вы можете получить к нему доступ.

activate(id) {
    this.id = id;
    return dpd.contacts.get(id).then(function(data) {
      console.log(data);
      this.contact = data;
    }.bind(this));
  }

3- (рекомендуется с ES6) вы можете использовать функцию стрелки (функции стрелки сохраняют контекст)

activate(id) {
    this.id = id;
    return dpd.contacts.get(id).then((data) => {
      console.log(data);
      this.contact = data;
    });
  }
 Andrew Grothe26 июл. 2016 г., 20:47
№1 и №2 тоже работают. Моя ошибка использовалаlet contact = this.contact, Видимо, это не сработает, где, какlet that = this работает. Странно, но я возьму это.
 Quentin Roy05 авг. 2016 г., 09:15
Это не странно. Если вы делаетеcontact = something, вы назначаете новое значениеcontact переменная, Вы не изменяете предыдущее значение, которое было ему присвоено. То, что вы пытаетесь сделать, это изменитьcontact собственностьthis объект. Это свойство не связано сcontact переменная (кроме того факта, что вы инициализируете его значение в значение, указанноеthis.contact). Единственный способ изменить значение, указанное свойствомprop объектаobj написав что-то похожее наobj.prop = something.
 Andrew Grothe26 июл. 2016 г., 20:43
Я уже попробовал # 1 без удачи. Собираюсь попробовать # 2, хотя, чтобы увидеть, как это работает. № 3 работает.

Ваш ответ на вопрос