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