Эмберджс и обещания

Мой стиль кодирования может быть плохим, так как я все еще учусь. Мне нужно знать, как обрабатывать передачу дополнительных параметров в цепочечные обещания в 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 может принять аргумент контекста

2 ответа

Решение

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

actions: {
  let foo = "bar";

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

Хотя методы блокировки решают вашу проблему, я все же думаю, что вы должны понимать решение, которое предлагает Стефан Пеннер. Функции в 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 затем передавая их все как параметры.

Другие вопросы по тегам