Emberjs и обещания

Мой стиль кодирования может быть плохим, поскольку я все еще учусь. Мне нужно знать, как обрабатывать дополнительные параметры для связанных промисов в Emberjs.

Чего я пытаюсь достичь. Множество промисов в моем маршруте выглядело беспорядочно, поэтому я решил написать функцию для каждого промиса.

model: function(){
  var self=this,carP,planeP,bikeP;
  carP = self.store.find('car');
  planeP = self.store.find('plane');
  bikeP = self.store.find('bikeP');

  pilotsP = planeP.then(function(planePArr){
    return planePArr.forEach(function(plane){
      return plane.get('pilots') //in plane model: pilots: DS.hasMany('pilot')
    });
  });   
  return Ember.RSVP.hash({
     cars: carP,
     planes: planeP,
     bikes: bikeP,
     pilots: pilotsP,
     city: self.store.createRecord('city'),
     owner: self.store.createRecord('owner'),
  })

}

Хэш действия моего того же маршрута содержит

actions: {
  save: function(){
    var self = this;
    return self._saveCity()
                         .then(self._getBikeRiders)
                         .then(self._getCarDrivers)
  }
}
_saveCity: function(){
   return this.currentModel.city.save();
 },
_getBikeRiders: function(value){

 },
_getCarDrivers: function(value){

 }

Когда я вызываю функцию self._saveCity(), она возвращает обещание, которое является хорошим, а затем передает разрешенное значение в this._getBikeRiders, функция _getBikeRiders(value) имеет значение параметра, которое получено из предыдущего обещания, в этом случае сохраните город, поэтому у нас есть название города.

Теперь, если в функции _getBikeRiders(value) мне нужно что-то сделать с другими значениями, я не могу ничего ей передать.

пример self._getBikeRiders(value,"some paramer) не проходит оба.

Я теряю контекст внутри функции _getBikeRiders: function(), поэтому не могу получить к ней доступ (я получаю глобальное окно).

Я не знаю, как реализовать это здесь Ember.RSVP.Promise может принимать аргумент контекста


person Rigel    schedule 02.10.2015    source источник


Ответы (2)


Мое предложение состоит в том, чтобы обернуть вызов this._getBikeRiders в функцию, чтобы вы могли передавать нужные вам параметры. Пример:

actions: {
  let foo = "bar";

  return this._saveCity()
    .then((value) => { this._getBikeRiders(value, foo); })
    .then(this._getCarDrivers());
}
person locks    schedule 02.10.2015

Хотя методы блокировки решают вашу проблему, я все же думаю, что вы должны понять решение, которое предлагает Стефан Пеннер. Функции в javascript имеют метод с именем bind(thisArg) что позволяет переопределить this. Итак, в вашем решении вы могли бы решить это так.

actions: {
  save: function(){
    var self = this;
    return self._saveCity()
                  .then(self._getBikeRiders.bind(self))
                  .then(self._getCarDrivers.bind(self))
  }
}

Использование .bind() может быть полезно во многих сценариях, так что это хороший способ запомнить. Если вам нужно много значений из this в Ember, может быть даже лучшим решением изменить this, а затем передать их все в качестве параметров.

person Karl-Johan Sjögren    schedule 02.10.2015