You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何延迟$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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:25:09