如何设计可以具有同步响应或异步响应的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); 
    } 
} 
+0

我认为你的意思'$ q.when'。 – vgrafe

+0

'$ q.resolve()'返回一个立即解决的承诺,这似乎是海报想要的。如果你执行'save()。then(function(){})',当'save()'返回'$ q.resolve()'时,'then'函数会被触发。为什么使用'when'? – danyamachine

+0

谢谢!你有建议如何为此编写测试吗?使用模拟httpbackend可以轻松实现'在线'流程,但是像 var ranCallback = false; (注意,contentInfo).then(function(){ ranCallback = true; }); expect(ranCallback).toBeTruthy(); 失败时,为'离线'流 –