Emberjs 和承诺
Emberjs and promises
我的编码风格可能不好,因为我还在学习中。我需要知道如何处理将额外参数传递给 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()
时,它 returns 一个很好的承诺,然后将解析后的值传递给 this._getBikeRiders
_getBikeRiders(value)
函数有一个参数值,它是从以前的承诺中收集的,在这种情况下保存城市,所以我们有城市名称。
现在如果在 _getBikeRiders(value)
函数中我需要用其他值做一些事情我不能传递任何东西给它。
例子
self._getBikeRiders(value,"some paramer)
两个都没有通过。
我在 _getBikeRiders: function()
函数中丢失了上下文,所以我无法访问它(我得到的是全局 window)。
我不知道如何在这里实现
Ember.RSVP.Promise could accept context argument
我的建议是将 this._getBikeRiders
调用包装在一个函数中,这样您就可以传递所需的参数。一个例子:
actions: {
let foo = "bar";
return this._saveCity()
.then((value) => { this._getBikeRiders(value, foo); })
.then(this._getCarDrivers());
}
虽然锁定方法可以解决您的问题,但我仍然认为您应该理解 Stefan Penner 建议的解决方案。 javascript 中的函数有一个名为 bind(thisArg)
的方法,可让您重新定义 this
。所以在你的解决方案中,你也可以这样解决它。
actions: {
save: function(){
var self = this;
return self._saveCity()
.then(self._getBikeRiders.bind(self))
.then(self._getCarDrivers.bind(self))
}
}
使用 .bind()
在很多情况下都很有用,因此这是一个很好记住的方法。如果您需要 Ember 中 this
的大量值,更改 this
然后将它们全部作为参数传递可能是更好的解决方案。
我的编码风格可能不好,因为我还在学习中。我需要知道如何处理将额外参数传递给 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()
时,它 returns 一个很好的承诺,然后将解析后的值传递给 this._getBikeRiders
_getBikeRiders(value)
函数有一个参数值,它是从以前的承诺中收集的,在这种情况下保存城市,所以我们有城市名称。
现在如果在 _getBikeRiders(value)
函数中我需要用其他值做一些事情我不能传递任何东西给它。
例子
self._getBikeRiders(value,"some paramer)
两个都没有通过。
我在 _getBikeRiders: function()
函数中丢失了上下文,所以我无法访问它(我得到的是全局 window)。
我不知道如何在这里实现 Ember.RSVP.Promise could accept context argument
我的建议是将 this._getBikeRiders
调用包装在一个函数中,这样您就可以传递所需的参数。一个例子:
actions: {
let foo = "bar";
return this._saveCity()
.then((value) => { this._getBikeRiders(value, foo); })
.then(this._getCarDrivers());
}
虽然锁定方法可以解决您的问题,但我仍然认为您应该理解 Stefan Penner 建议的解决方案。 javascript 中的函数有一个名为 bind(thisArg)
的方法,可让您重新定义 this
。所以在你的解决方案中,你也可以这样解决它。
actions: {
save: function(){
var self = this;
return self._saveCity()
.then(self._getBikeRiders.bind(self))
.then(self._getCarDrivers.bind(self))
}
}
使用 .bind()
在很多情况下都很有用,因此这是一个很好记住的方法。如果您需要 Ember 中 this
的大量值,更改 this
然后将它们全部作为参数传递可能是更好的解决方案。