如何设计可以具有同步响应或异步响应的API
问题描述:
我需要我的服务层支持在应用程序联机时发出http请求,并在应用程序脱机时也保存请求,但是这会导致响应当应用程序处于在线状态时可能是承诺,或者应用程序处于脱机状态时是同步的。我现在有如何设计可以具有同步响应或异步响应的API
someService.save(data).then(function(response) {
performSomeAction();
});
然而someService的实施将成为
if (isOnline()) {
return http.post()
} else {
cachePostForLater();
}
什么是从服务返回,试图隐藏在线/离线从控制器层节省的复杂性的最好的事情?
答
您的同步功能应返回您手动解析的承诺。这样,调用api服务的代码可以不知道该调用是否在线时进行。 如果包含$q
为您服务的依赖,你可以做
function save(){
if (isOnline()) {
return http.post()
} else {
cachePostForLater();
return $q.resolve(null);
}
}
我认为你的意思'$ q.when'。 – vgrafe
'$ q.resolve()'返回一个立即解决的承诺,这似乎是海报想要的。如果你执行'save()。then(function(){})',当'save()'返回'$ q.resolve()'时,'then'函数会被触发。为什么使用'when'? – danyamachine
谢谢!你有建议如何为此编写测试吗?使用模拟httpbackend可以轻松实现'在线'流程,但是像 var ranCallback = false; (注意,contentInfo).then(function(){ ranCallback = true; }); expect(ranCallback).toBeTruthy(); 失败时,为'离线'流 –