Ember RSVP承诺停止工作

时间:2016-01-08 17:03:48

标签: ajax ember.js promise

出于某种原因,我在一个动作中创建的RSVP承诺停止了为我工作,我无法弄清楚什么时候错误使它停止工作。

我有一个发送动作并等待回复的组件

// COMPONENT IN ITEM ROUTE
callAjaxAction() {
  this.setProperties({working:true});
  Ember.RSVP.cast(this.attrs.action()).finally(() => {
    Ember.$('.draggable').animate({
      left: 0
    });
    this.setProperties({working:false});
  });
}

组件的这个特定实例在控制器中调用此操作

// IN ITEM CONTROLLER
placeBid() {
  return new Ember.RSVP.Promise((resolve,reject) => {
    if(this.get('winning')) {
      this.get('notification')._confirm({message: "You are currently the highest bidder, would you like to continue with your bid?",isConfirm: true}).then(()=>{
        console.log('confirmed');
        this.send('placeBidActual').then(()=>{
          resolve();
        }).catch(()=>{
          reject();
        });
        return true;
      }).catch(()=>{
        resolve();
        console.log('denied');
        return false;
      });
    } else {
      setTimeout(()=>{
        this.send('placeBidActual').then(()=>{
          resolve();
        }).catch(()=>{
          reject();
        });
      },500);
    }
  });
}

此操作在服务上调用confirm方法,并在用户已赢得此项目的情况下等待用户返回yes。否则,我只是立即调用实际的ajax操作,该操作看起来像这样

// IN ITEM CONTROLLER
placeBidActual() {
  return new Ember.RSVP.Promise((resolve,reject) => {
    Ember.$.ajax({
      ...
    }).then((response)=>{
      (do some stuff with the response)
      resolve();
    }, (reason)=>{
      (do something with rejection reason)
      reject(reason);
    });
  });
}

在控制台中我收到错误

Uncaught TypeError: Cannot read property 'then' of undefined

在其中声明this.send('placeBidActual')

的行

更新

这可能是对预期流程的更好解释。

用户尝试出价,用户滑动组件以表示他们希望出价。此时的UI显示加载指示符,并在重置UI之前等待ajax操作完成。 如果用户不是该项目的最高出价者,则它将直接进入ajax操作,并在完成时表示该组件重置UI。 但是,如果用户是该项目的最高出价者,则应显示确认消息(使用我已设置的通知服务)并等待用户确认或拒绝。如果他们否认它只是取消并表示组件重置UI。如果用户确认,则调用ajax操作,完成后表示组件重置UI。

2 个答案:

答案 0 :(得分:1)

更新的答案: 这不起作用,因为send不返回操作的值。

我建议将placeBidActual操作移动到控制器上的方法,并像任何常规方法一样调用它。这样您就可以获得返回值,并可以在其上调用.then

答案 1 :(得分:-1)

你应该传递一个函数,而不是调用它。

  

相反:   Ember.RSVP.cast(this.attrs.action()).finally(() =>

     

试一试:   Ember.RSVP.cast(this.attrs.action).finally(() =>

调用函数this.attrs.action()是否为Promise传递了undefined。