一尘不染

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

angularjs

从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来警告用户错误。

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


阅读 232

收藏
2020-07-04

共1个答案

一尘不染

通常,您将使用回调处理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?
2020-07-04