当前位置: 首页 > 面试题库 >

AngularJS-为什么用$ http保证($ q)?

单耘豪
2023-03-14
问题内容

从jQuery转换几年后,我正在学习AngularJS。还有一些更直观。有些不是很多:)。

我正在努力使我对promise的使用有所了解,尤其是在与$ http一起使用$ q的情况下,我找不到关于这两个组合的太多信息。

为什么我要使用promise代替成功/错误回调?它们都在现实中利用了回调,那么为什么将诺言视为更好呢?例如,我可以设置get(...)如下功能:

function get(url, success, error) {
    success = success || function () {};
    error = error || function () {};

    $http.get(url)
        .success(function (data) {
            success(data);
        })
        .error(function (error) {
            error(error);
        });
}

get('http://myservice.com/JSON/',
    function () {
        // do something with data
    },
    function () {
        // display an error
    }
);

哪个好(?),因为它使我可以完全控制正在发生的事情。如果我打电话,get(...)那么无论在何处,我都可以控制任何成功/错误get

如果将其转换为使用promise,则会得到:

function get(url) {
    return $http.get(url)
        .then(function (data) {
            return data;
        },
        function (error) {
            return error;
        });
}

get('http://myservice.com/JSON/')
    .then(function (data) {
        // do something with data
    });
    // cannot handle my errors?

我同意,这简明扼要。我们也不必显式担心成功/错误回调,但是我似乎一开始就无法控制我的错误回调-因为我无法配置第二个回调来处理错误。

这意味着,如果我在可被多个控制器使用的服务中使用此功能,则无法更新UI来警告用户错误。

我想念什么吗?为什么会优先选择诺言?我找不到一个例子说明为什么。


问题答案:

通常,您将使用回调处理Javascript中的异步任务;

$.get('path/to/data', function(data) {
  console.log(data);
});

它工作正常,但是当您进入所谓的“回调地狱”时会变得复杂起来。

$.get('path/to/data', function(data) {
  $.get('path/to/data2' + data, function(data2) {
    $.get('path/to/data3' + data2, function(data3) {
      manipulate(data, data2, data3);
    }, errorCb);
  }, errorCb);
}, errorCb);

另一种方法是处理承诺和延迟的对象;

Deferreds - representing units of work
Promises - representing data from those Deferreds

坚持这个议程可以在每种极端的异步任务情况下为您提供帮助:

  1. 您有一个常规调用,需要从服务器获取数据,对其进行操作并返回到作用域
  2. 您有多个通话,每个通话都取决于珍贵的通话(cahin策略)
  3. 您要发送多个(并行)呼叫并在1个块内处理它们的成功
  4. 您希望对代码进行整理(防止处理控制器上的处理结果)

您的任务是使用$ q和$ http处理的最简单的任务

function get(url) {
    var deferred = $q.defer();
    $http.get(url)
        .success(function (data) {
            deferred.resolve(data);
        })
        .error(function (error) {
            deferred.reject(error);
        });

    return deferred.promise;
 }

和调用服务功能是一样的

get('http://myservice.com/JSON/')
.then(function (data) {
    // do something with data
});
// cannot handle my errors?


 类似资料:
  • 主要内容:可见性,原子性,举个例子首先要了解的是,volatile可以保证可见性和顺序性,这些都很好理解,那么它为什么不能保证原子性呢? 可见性 可见性与Java的内存模型有关,模型采用缓存与主存的方式对变量进行操作,也就是说,每个线程都有自己的缓存空间,对变量的操作都是在缓存中进行的,之后再将修改后的值返回到主存中,这就带来了问题,有可能一个线程在将共享变量修改后,还没有来的及将缓存中的变量返回给主存中,另外一个线程就对共享变量

  • 主要内容:可见性,原子性,举个例子首先要了解的是,volatile可以保证可见性和顺序性,这些都很好理解,那么它为什么不能保证原子性呢? 可见性 可见性与Java的内存模型有关,模型采用缓存与主存的方式对变量进行操作,也就是说,每个线程都有自己的缓存空间,对变量的操作都是在缓存中进行的,之后再将修改后的值返回到主存中,这就带来了问题,有可能一个线程在将共享变量修改后,还没有来的及将缓存中的变量返回给主存中,另外一个线程就对共享变量

  • 问题内容: 因为在AngularJS中使用CORS和http身份验证可能会比较棘手,所以我编辑了问题以分享一个经验教训。首先,我要感谢igorzg。他的回答对我很有帮助。场景如下:您想使用AngularJS $ http服务将POST请求发送到另一个域。获取AngularJS和服务器设置时,需要注意一些棘手的事情。 第一:在您的应用程序配置中,您必须允许跨域调用 第二:您必须指定withCrede

  • 我正在学习“放心框架”。 我使用http://ziptasticapi.com免费的API为我的演习。 当我打电话: 我得到以下字符串: {“国家”:“美国”、“州”:“正义与发展党”、“城市”:“阿达克”} as响应字符串值。 当我尝试时: 我突然想到: JAVAlang.IllegalStateException:无法分析对象,因为响应中未指定支持的内容类型。内容类型为“文本/html”;字符

  • 问题内容: 我在节点和角度的CORS上遇到了问题,并为true添加此选项解决了我的问题。但是我找不到有关它是什么以及它在做什么的信息。请有人可以解释吗? 问题答案: 简短答案: 使您的浏览器在XHR请求中包含cookie和身份验证标头。如果您的服务依赖于任何cookie(包括会话cookie),则仅在使用此选项集的情况下才能使用。 更长的解释: 当您向其他原始服务器发出Ajax请求时,浏览器可能会

  • 本文向大家介绍用什么工具保证一致的代码风格?为什么要这样?相关面试题,主要包含被问及用什么工具保证一致的代码风格?为什么要这样?时的应答技巧和注意事项,需要的朋友参考一下 团队协作时,保证一致的代码风格是非常重要的,这样团队成员才可以更快地修改代码,而不需要每次去适应新的风格。这些工具可以帮助我们: [ESLint] (http://eslint.org/) [Standard] (https:/