出于某种原因,我在一个动作中创建的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。
答案 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。