观看了很多Egghead.io视频,我注意到一个常见的模式是返回自定义承诺并在回调中解决它.
.factory('myFact',function($q,$http) { return { getData: function() { var deferred = $q.defer(); $http.get('/path/to/api') .success(function(data) { deferred.resolve(data); }); return deferred.promise; } }; });
我通常会这样写:
.factory('myFact',function($http) { return { getData: function() { return $http.get('/path/to/api') .then(function(res) { return res.data; }); } }; });
返回$q.defer()承诺而不是$http承诺有什么好处吗?这些方法与我相同.
不,没有优势,它是一样的,在你的第一个代码剪断你创建了一个
$q.defer()实例然后你调用它的resolve()方法来创建一个已解决的promise.
这是您在处理异步函数和未来对象时需要知道并传递throwJs的过程,这些对象具有不同的值或新数据,您将需要知道它何时发生,因为您的应用程序中的相关方可能会需要在完成时访问延迟任务的结果.
现在使用$http时,您不必执行任何操作,因为它已经返回已解决的承诺,您可以直接调用它的then()方法,除非您有不同的方法来执行操作,并且您需要实现不同的方法.
但并非所有angularJs服务都能为您完成工作,例如,查看$resource,它包含$http以用于RESTful Web API场景. $resource将不会返回已解决的承诺,承诺是,您将获得一个,但您需要执行解决它的最后一步(check this stack question或this,也许this article about Amber Kaplan’s own experience working with Rest).
所以你如何做到这一点很好,这就是我在使用$http时也是这样做的,但是第一个代码片段是我们将需要以不同的方式做事时我们将要搜索的代码. http或强制其他服务“与’合作’或’像’工作’AJAX.