通常我可以为拒绝的承诺编写错误处理程序,如下所示:
user.save().then(function() {
// do stuff
}, function(reason) {
user.rollback();
_this.send('showModal', 'error');
});
假设我有另一个会导致承诺失败的情况 - 例如,我提前知道我的应用程序没有互联网连接。
我可以在保存之前检查
if (this.get('connection.isOffline')) {
this.send('showModal', 'disconnected')
} else {
// proceed as normal...
user.save().then(function() {
}
但我不想一遍又一遍地复制这段代码。
一种想法是强制所有承诺在应用程序离线时拒绝,然后在我的拒绝处理程序中,我可以检查应用程序是否在线/离线并呈现相应的消息。
或者,我可以拦截所有Ember REST调用并首先检查连接,在应用程序离线时中止调用并呈现消息。
首选哪种方法?还有另一种方式吗?
答案 0 :(得分:1)
我认为您最好的选择是扩展/重新打开DS.Model并覆盖.save()以检查您的连接。您需要在DI容器中注册连接对象/控制器/任何内容,以便它可以在基本模型中使用,或者重新打开DS.Model。
我不确定您的连接信息是如何确定的,或者您的应用程序中的哪个位置可用..但无论对象如何确定,我都会通过应用程序初始化程序和container.register将其注册到DI容器中()内。然后在你重写的save()中执行this.store.container.lookup(“type:name”)。get('connection.isOffline')来检查连接状态并执行任何操作。您可以使用this.store.container.lookup(“route:application”)。send(“offlineSaveAttempt”),或通过DS.PromiseObject.create()返回被拒绝的承诺,以保持一致,但更快失败..或者其他。< / p>
要处理find(),你必须在商店上扩展/重新开放 - 如果这是一个要求,你最好不要专门处理商店而不是触摸DS.Model。你感兴趣的方法是.scheduleSave()和.find()。你会做同样的容器查找来找到你的连接对象/控制器/等等,但只是this.container.lookup()