本篇文章主要的介紹了關於angularjs中的服務,還有關於angularjs中的依賴關係詳情。現在就讓我們一起來看看這篇文章吧
譯者註: 看到了一篇非常好的文章,如果你有興趣,可以查看: Promises與Javascript非同步程式設計, 裡面對Promises規範和使用情景,好處講的非常好透徹,個人覺得簡單易懂。
既然是用來處理非同步程式設計的,那麼在瀏覽器端的JS裡,主要是2種: setTimeout 和 Ajax 請求. promise 的使用就很像Ajax請求的成功和失敗回呼。
此承諾/延遲(promise/deferred)實現的靈感來自於 Kris Kowal's Q CommonJS Promise建議文件將承諾(promise) 作為和異步執行操作(action)結果對象進行交互的接口,在指定的時間內可能完成也可能無法完成(如超時,錯誤,攔截等等)。
從錯誤處理的角度看,延遲(deferred )和承諾(promise ) API 對於非同步程式設計來說, 和同步程式設計的 try,catch, 以及throw 作用差不多.
// 为了演示的目的,此处我们假设 `$q`, `scope` 以及 `okToGreet` 引用 在当前执行环境中可用 // (比如他们已经被注入,或者被当做参数传进来了). function asyncGreet(name) { var deferred = $q.defer(); setTimeout(function() { // 因为此function 在未来的事件循环中异步执行, // 我们需要把代码包装到到一个 $apply 调用中,以便正确的观察到 model 的改变 scope.$apply(function() { deferred.notify('即将问候 ' + name + '.'); if (okToGreet(name)) { deferred.resolve('你好, ' + name + '!'); } else { deferred.reject('拒绝问候 ' + name + ' .'); } }); }, 1000); return deferred.promise; } var promise = asyncGreet('小漠漠'); promise.then(function(greeting) { alert('成功: ' + greeting); }, function(reason) { alert('失败鸟: ' + reason); }, function(update) { alert('收到通知: ' + update); });
引人這種額外的複雜性的效果起初可能不明顯。在promise 和deferred APIs 承諾時好處就看出來了,請參考: https://github.com/kriskowal/uncommonjs/blob/master/promises/specification.md
另外promise api允許那些在傳統的回呼( CPS )方法中很難的實現的組合。更多資訊請查閱 Q文件 ,特別是 串列與並行的合併一節。
透過呼叫 $q.defer() 可以建立一個新的 deffered 實例。
deffered 物件用來將 Promise 實例與 標記任務狀態(執行成功還是不成功)的 API 相關聯。
resolve(value) —傳入 value 解決派生的 promise。如果 value 是一個透過 $q.reject 建構的拒絕物件(rejection) , 該promise 將被拒絕。
reject(reason) ——拒絕派生的promise,並提供原因 。這相當於透過 $q.reject建構的拒絕物件(rejection)作為參數傳遞給 resolve。
notify(value) -在 promise 執行的過程中提供狀態更新。這在 promise 被解決或拒絕之前可能會被多次呼叫。
promise – {Promise} ——與延遲(deferred)相關聯的promise對象。
當建立 deferred 實例時會建立一個新的 promise 物件,並且可以透過 deferred.promise 得到該引用。
promise 物件的目的是在 deferred 任務完成時,允許感興趣的部分取得其執行結果。
then(successCallback, errorCallback, notifyCallback) ——不管promise 是被處理還是被拒絕, 一旦結果可用,then 就會盡快地非同步呼叫成功/錯誤回呼函數只要結果是可用的。呼叫回調函數時傳遞單一參數: 結果 或拒絕的理由。此外,notify 回呼可能被調用 0到多次,以提供 提供一個進度指示,之前承諾解決或拒絕。
這個方法 傳回一個新的promise 物件, 根據 successCallback , errorCallback的回傳值來解決或拒絕 。它也透過 notifyCallback 方法的回傳值進行通知。 promise 不能從notifyCallback方法解決或拒絕 。
catch(errorCallback) —— promise.then(null, errorCallback) 的捷徑
finally(callback) ——讓你可以觀察到一個promise 是被執行還是被拒絕, 但這樣做不用修改最後的value值。這可以用來做一些釋放資源或清理無用物件的工作,不管promise 被拒絕還是解決。更多的資訊請參閱完整文件規格.
因為在ES3版本的JavaScript中finally 是一個保留字關鍵字,不能作為屬性名稱,為了適配IE8,您需要使用promise['finally'](callback) 這種形式來呼叫該方法。
因為呼叫一個 promise 的 then 方法傳回一個新的衍生 promise實例,所以建構promises鏈也是很容易的:
promiseB = promiseA.then(function(result) { return result + 1; }); // promiseB 将会在处理完 promiseA 之后立刻被处理, // 并且其 value值是promiseA的结果增加1
我们可以创建任意长度的promise链;因为一个promise可以被另一个promises处理(进一步推迟解决完成时间),所以在promise链上的任意一点进行 暂停/推迟解决 都是可行的。 这使得实现功能强大的APIs 成为现实,例如 $http 的响应拦截器。
主要区别有两点:
Angular中的$q 集成了 ng.$rootScope.Scope Scope模型观察机制,这意味着对models 的解决或拒绝速度将会更快,避免不必要的浏览器重绘(会导致UI闪烁)。
Q 比 $q拥有更多的功能特性,但带来的是代码字节数的增加。 $q 很轻量级,但包含了一般异步任务所需的所有重要功能。
it('should simulate promise', inject(function($q, $rootScope) { var deferred = $q.defer(); var promise = deferred.promise; var resolvedValue; promise.then(function(value) { resolvedValue = value; }); expect(resolvedValue).toBeUndefined(); // 模拟 promise 的 resolving deferred.resolve(123); // 注意 'then' function 不是同步调用的. // 因为我们想要 promise API 一直是异步的(async), // 不管是在同步调用还是异步调用中都是如此. expect(resolvedValue).toBeUndefined(); // 使用 $apply()将 promise resolution 传递到 'then' functions . $rootScope.$apply(); expect(resolvedValue).toEqual(123); }));
$rootScope
结合多个promises为单个promise,在所有输入的promise都处理之后,组合之后的promise才会处理完成。
参数: promises
类型: Array.
描述: promises的数组或者引用
返回: Promise 返回单个的 promise,将与一个数组解决/散列值, 每个值对应于在相同的索引/关键的承诺 承诺 /散列数组。 如果任何承诺解决排斥,这产生的承诺将被拒绝 拒绝相同的值。(想看更多就到PHP中文网AngularJS开发手册中学习)
创建一个 递延 对象代表一个将来完成任务。
返回 Deferred 返回一个新实例的Deferred。
创建一个指定拒绝原因的promise. 此api应该用于在一个promises链中进行拒绝。 如果你正在处理promise 链中的最后一个promise,你不需要担心。
把 deferreds/promises 与我们熟悉的的 try/catch/throw行为进行对比,可以认为 reject 相当于 JavaScript 中的throw 关键字。 这也意味着如果你通过一个 promise 的 error回调, “catch”了一个错误 ,你想要指明当前的承诺已经执行出错了,就必须重新抛出一个“附带了错误信息,拒绝通过的reject” 。
promiseB = promiseA.then(function(result) { // success: 此处可以执行某些操作,然后直接使用原有的result, // 或者对result进行操作,来处理接下来的promiseB return result; }, function(reason) { // error: handle the error if possible and // resolve promiseB with newPromiseOrValue, // 否则转向拒绝 promiseB 的分支 if (canHandle(reason)) { // 处理错误和恢复 return newPromiseOrValue; } return $q.reject(reason); });
参数: reason
类型: *
描述: Constant, message, exception 或代表拒绝原因的 object。
返回: Promise 返回一个promise ,已经因为 reason 而被拒绝了 。
将一个对象(可能是value 或 [第三方]then-able promise) 包装为一个 $q promise。 这在你不确定所处理的对象是否是一个promise 时是很有用的,有可能该对象来自于一个不被信任的源头。
参数: value
类型: *
描述: promise 的值
返回 Promise 根据传入的值/或promise 返回一个包装后的 promise
本篇文章到这就结束了(想看更多就到PHP中文网AngularJS使用手册中学习),有问题的可以在下方留言提问。
以上是AngularJS中的服務是什麼? angularjs的使用方法介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!