从jQuery转换几年后,我正在学习AngularJS。还有一些更直观。有些不是很多:)。
我正在努力使我对promise的使用有所了解,尤其是在与$ http一起使用$ q的情况下,我找不到关于这两个组合的太多信息。
为什么我要使用promise代替成功/错误回调?它们都在现实中利用了回调,那么为什么将诺言视为更好呢?例如,我可以设置get(...)如下功能:
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。
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
坚持这个议程可以在每种极端的异步任务情况下为您提供帮助:
您的任务是使用$ 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?