如何延迟$http请求?求非拦截器实现方案
解决Angular延迟$http请求的问题
你之前的代码问题出在请求根本没被延迟——你把$http.get().then(...)的结果直接传给了$timeout,但$http.get()在函数执行的瞬间就已经发起请求了,$timeout只是延迟了返回处理后的数据而已,完全没拦住请求发送的时机。
要真正延迟请求的执行,你需要把$http.get()的调用放在$timeout的回调函数里,这样只有当延迟结束后,才会触发HTTP请求。下面是两种可行的写法:
写法一:直接在$timeout回调里发起请求
githubService.getUserEvents = function getUserEvents() { // 先等待5秒,再发起请求 return $timeout(function() { return $http.get(ANGULAR_EVENTS).then(function (eventsData) { return _.map(eventsData.data, function (data) { return { type: data.type, user: data.actor.login, avatarUrl: data.actor.avatar_url, createdOn: data.created_at, repo: data.repo.name }; }); }); }, 5000); };
写法二:链式调用promise(可读性更好)
如果想把逻辑拆分得更清晰,可以把延迟、请求、数据转换分成独立的步骤:
githubService.getUserEvents = function getUserEvents() { // 先返回一个延迟5秒的Promise return $timeout(function() {}, 5000) // 延迟结束后发起请求 .then(function() { return $http.get(ANGULAR_EVENTS); }) // 处理请求返回的数据 .then(function (eventsData) { return _.map(eventsData.data, function (data) { return { type: data.type, user: data.actor.login, avatarUrl: data.actor.avatar_url, createdOn: data.created_at, repo: data.repo.name }; }); }); };
这两种写法的核心都是推迟$http.get()的执行时机,而不是延迟处理请求结果,这样就能真正实现5秒后才发送HTTP请求的效果。
内容的提问来源于stack exchange,提问作者bier hier
相关产品推荐
相关产品推荐

