【问题标题】:Emberjs and promisesEmberjs 和承诺
【发布时间】:2015-12-30 21:28:51
【问题描述】:

我的编码风格可能不好,因为我还在学习。我需要知道如何处理将额外参数传递给 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 could accept context argument

【问题讨论】:

    标签: ember.js rsvp-promise


    【解决方案1】:

    虽然锁定方法可以解决您的问题,但我仍然认为您应该了解 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 然后将它们全部作为参数传递可能是一个更好的解决方案。

    【讨论】:

      【解决方案2】:

      我的建议是将this._getBikeRiders 调用包装在一个函数中,这样您就可以传递您需要的参数。一个例子:

      actions: {
        let foo = "bar";
      
        return this._saveCity()
          .then((value) => { this._getBikeRiders(value, foo); })
          .then(this._getCarDrivers());
      }
      

      【讨论】:

        猜你喜欢
        • 2013-12-15
        • 1970-01-01
        • 2015-05-12
        • 2023-03-26
        • 1970-01-01
        • 2021-08-15
        • 2019-05-03
        • 1970-01-01
        • 2016-03-04
        相关资源
        最近更新 更多