在 AngularJS 中,如何等待 $http 请求的响应?

2023-12-08

我正在多个页面中使用来自 RESTful 服务的一些数据。 所以我为此使用角度工厂。因此,我需要从服务器获取一次数据,并且每次我都使用该定义的服务获取数据。就像全局变量一样。这是示例:

var myApp =  angular.module('myservices', []);

myApp.factory('myService', function($http) {
    $http({method:"GET", url:"/my/url"}).success(function(result){
        return result;
    });
});

在我的控制器中,我将此服务用作:

function myFunction($scope, myService) {
    $scope.data = myService;
    console.log("data.name"+$scope.data.name);
}

按照我的要求,它对我来说工作得很好。 但这里的问题是,当我重新加载网页时,服务将再次被调用并请求服务器。如果在依赖于“定义的服务”的其他函数执行之间,它会给出诸如“某物”未定义之类的错误。所以我想在我的脚本中等待,直到服务加载。我怎样才能做到这一点?无论如何,AngularJS 中有这样做吗?


当您不知道异步操作何时完成时,您应该使用 Promise。承诺“代表一项尚未完成但预计将在未来完成的操作”。 (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise)

一个示例实现如下:

myApp.factory('myService', function($http) {

    var getData = function() {

        // Angular $http() and then() both return promises themselves 
        return $http({method:"GET", url:"/my/url"}).then(function(result){

            // What we return here is the data that will be accessible 
            // to us after the promise resolves
            return result.data;
        });
    };


    return { getData: getData };
});


function myFunction($scope, myService) {
    var myDataPromise = myService.getData();
    myDataPromise.then(function(result) {  

       // this is only run after getData() resolves
       $scope.data = result;
       console.log("data.name"+$scope.data.name);
    });
}

编辑:关于 Sujoy 的评论 我需要做什么才能使 myFuction() 调用在 .then() 函数完成执行之前不会返回。

function myFunction($scope, myService) { 
    var myDataPromise = myService.getData(); 
    myDataPromise.then(function(result) { 
         $scope.data = result; 
         console.log("data.name"+$scope.data.name); 
    }); 
    console.log("This will get printed before data.name inside then. And I don't want that."); 
 }

好吧,我们假设对 getData() 的调用需要 10 秒才能完成。如果该函数在那段时间没有返回任何内容,它实际上会变成正常的同步代码,并会挂起浏览器直到完成。

不过,随着承诺立即返回,浏览器可以同时继续处理其他代码。一旦 Promise 解决/失败,就会触发 then() 调用。因此,这种方式更有意义,即使它可能会使代码流程变得更加复杂(毕竟复杂性是异步/并行编程的常见问题!)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 AngularJS 中,如何等待 $http 请求的响应? 的相关文章

随机推荐

  • 在 Windows 中使用 Python 3 连接到 Sql Server

    有人能给我指出如何使用 Python 连接到 MS SQL Server 的正确方向吗 我想要做的是读取一个文本文件 提取一些值 然后将文本文件中的值插入到我的 Sql Server 数据库中的表中 我使用的是Python 3 1 3 我在
  • PyQt 更新 QLabel

    我有一个 QLabel 我使用新的 text 动态更新它 如下所示 self ui mylabel text foobar 问题是 此后它不会更新窗口上的新值 我尝试打电话self app processEvents 甚至是标签本身的更新s
  • 反转属性的最短方法

    在Java中我有一个java util Properties对象 我想获得另一个具有相同对但键转换为值的对象 反之亦然 如果存在冲突 即有两个相等的值 则只需选择任意键作为值 最短的方法是什么 请随意使用图书馆 公共收藏或其他任何东西 您可
  • UILongPressGestureRecognizer问题

    我有一个关于 UILongPressGestureRecognizer 的问题 我添加了如下代码所示的手势 ViewDidLoad UILongPressGestureRecognizer longRecognizer UILongPres
  • Ruby:require 与 require_relative - 在 Ruby <1.9.2 和 >=1.9.2 中运行的解决方法的最佳实践

    如果我想 最好的做法是什么requireRuby 中的相对文件and我希望它在 1 8 x 和 gt 1 9 2 中都能工作 我看到几个选项 just do LOAD PATH lt lt 并忘记一切 do LOAD PATH lt lt
  • C# 预处理器根据环境变量定义符号

    我有一些这样的逻辑 define MYVAR if MYVAR Attribute1 else Attribute2 endif 我希望能够根据环境变量切换应用于方法的属性 就像环境变量一样MYVAR设置后 然后实际定义符号 MYVAR 反
  • 获取python中两个日期之间日期的星期天数

    正如我在网站中搜索以获取 python 中的工作日数 但我也需要工作日的日期 My input将 start date 01 03 2019 end date 15 03 2019 days monday tuesday 预期的Output
  • 我可以从 Emacs 向 Windows 发送 按键吗?

    There is a function w32 toggle lock key to effectively simulate a press of capslock numlock or scroll lock key Is there
  • 如何将长整数和/或无符号整数传递给 MPI 参数?

    假设我有一个非常大的数组 我希望使用 MPI v1 发送或接收 为了索引该数组 我使用无符号长整数 现在 我见过的所有 MPI 函数调用都使用 int 类型作为其 count 参数 如下例所示 MPI Recv void buf int c
  • AS3在鼠标单击而不是在注册时放大和缩小

    我试图通过单击和双击鼠标事件来放大和缩小蒙版鼠标平移图像 我对图像进行了缩放 但它总是在左边缘注册点上放大 而不是在我单击的位置上 我完全不知道如何编写这个代码 并且花了一整天的时间在互联网上试图弄清楚它 但没有运气 我希望有人能帮助我解决
  • php 中不区分大小写的突出显示

    我使用这个函数来突出显示 mysql 查询的结果 function highlightWords string word string str replace word span class highlight word span stri
  • 在 Octave 中求解非线性方程

    我是 Octave 的新手 想知道如何求解非线性方程 这是一个示例方程 x 4 16x 3 61x 2 22x 12 0 Update w x y 1 3 2w 3x 4y 5 10 w x y 1 4 thanks Use fzero得到
  • 在“COPY .. TO ..”期间将时间戳转换为给定时区的本地时间

    我在 PostgreSQL 数据库中有一个日志表 其中包含event类型列timestamp without time zone 现在我有一个 bash 脚本 它从日志数据库创建一个 CSV 文件 psql c COPY SELECT ev
  • android 的 sendDataMessage() 的工作示例

    我尝试过使用发送数据消息 of android telephony SmsManager在我能遇到的几乎所有样本的帮助下 但没有成功 如果您想查看代码 只需检查 mobiForge 上的 发送短信 android 链接 我猜它是最受欢迎的链
  • “导入 pyodbc”导致“没有名为 pyodbc 的模块”

    我最近跑步pip install pyodbc 这表明它在cmd上成功安装了pyodbc 然而当我这样做时import pyodbc在 IDLE 中 我收到一条错误消息 没有名为 pyodbc 的模块 我运行时似乎只安装了两个文件pip i
  • Angular Universal (ssr) 不适用于 Firestore 和 Geofirestore

    Issue Angular Universal ssr 不适用于使用 Firebase Firestore 数据库的页面 Tech Angular 版本 7 Angular Cli Angular Universal Firebase 托管
  • 如何在Python中将星号传递给模块“sh”?

    我在 python 中使用 sh 模块来调用 Linux 上的外部命令 在我的特定情况下 我想调用 du 命令 因为它比 手动 进行此类计算更有效 不幸的是 以下行不起作用 output sh du sx tmp 但这确实有效 output
  • 如何使用Python并行读取/处理大文件

    我几乎有一个大文件20GB 多于20 mln行 每行代表单独的序列化JSON 读取文件line by line作为常规loop并对线路数据进行操作需要很多时间 有没有state of art接近或best practices用于读取大文件p
  • JavaScript 库中的前导分号有什么作用?

    在几个 JavaScript 库中 我一开始就看到了这种表示法 Library XYZ function and so on 虽然我对 立即执行函数 语法非常满意 function 我想知道前导分号的用途是什么 我所能想到的就是它是一种保险
  • 在 AngularJS 中,如何等待 $http 请求的响应?

    我正在多个页面中使用来自 RESTful 服务的一些数据 所以我为此使用角度工厂 因此 我需要从服务器获取一次数据 并且每次我都使用该定义的服务获取数据 就像全局变量一样 这是示例 var myApp angular module myse