从 Ember 中的控制器操作返回一个承诺?
Posted
技术标签:
【中文标题】从 Ember 中的控制器操作返回一个承诺?【英文标题】:Return a promise from a controller action in Ember? 【发布时间】:2014-01-15 14:30:34 【问题描述】:我有一个组件需要与控制器通信,并最终在控制器说一切正常之后执行一些清理操作(即,jQuery “un”-initialization)。我认为实现这一点的最佳方法是承诺,以便在控制器完成其任务后组件可以清理。但是控制器操作如何返回承诺?或者,组件可以直接在控制器上调用动态方法吗?
例如,假设我有一个ModalDialogComponent
。
App.ModalDialogComponent = Ember.Component.extend
didInsertElement: ->
@$('.modal').modal('show')
actions:
save: ->
@sendAction('save').then(@closeModal.bind(@))
# some other actions are omitted
closeModal: ->
@$('.modal').modal('hide')
我可以在一个名为 foo
的模板中实例化组件,
modal-form save="save" ...
并在FooController上实现save
方法
App.FooController = Ember.ObjectController.extend
save: ->
# how can we tell the component that this was successful?
如您所见,我只希望closeModal
函数在save
操作成功的情况下执行。也就是说,只有在记录保存成功的情况下才关闭模态框。
这可能吗,还是我完全错了?
【问题讨论】:
【参考方案1】:send
和 sendAction
是一种方式,也就是说,您可以发送延迟到操作并期望它解决/拒绝它。
var defer = Ember.RSVP.defer();
defer.promise.then(function(resolvedValue)
alert(resolvedValue);
);
setTimeout(function()
defer.resolve('hello world');
,2000);
你的看起来有点像这样
var defer = Ember.RSVP.defer(),
self = this;
defer.promise.then(function()
self.closeModal();
,
function()
alert('error');
);
this.sendAction('save', defer);
保存操作
actions:
save: function(defer)
// if succeeded
defer.resolve();
// or if failure occurs
defer.reject();
要小心,你要确保你没有遗漏拒绝路线,你不想让模态卡在那里,因为保存失败并且没有失败方法。
对不起,我没有转换成咖啡脚本,我想你要么理解要么转换并理解,我不会给你错误的答案。
【讨论】:
CoffeeScript 没问题。谢谢:) 向 sendAction 传递承诺...你真是个天才! Rawr,感觉是相互的;) 很好,易于理解,谢谢!将使用和重复使用。以上是关于从 Ember 中的控制器操作返回一个承诺?的主要内容,如果未能解决你的问题,请参考以下文章
从 Promise 处理程序调用 Ember _super 方法