この記事では主にangularjsのサービスとangularjsの依存関係の詳細を紹介します。今すぐこの記事を見てみましょう
翻訳者注: 非常に良い記事を拝見しました。興味があればチェックしてみてください: Promise と Promise に直面する Javascript 非同期プログラミング 仕様、使用法シナリオやメリットが非常に丁寧に説明されており、個人的にはシンプルで理解しやすいと思います。
非同期プログラミングを処理するために使用されるため、ブラウザ側 JS には setTimeout リクエストと Ajax リクエストの 2 つの主なタイプがあります。Promise の使用は、Ajax リクエストの成功および失敗のコールバックと非常に似ています。
このプロミス/遅延実装は、Kris Kowal の Q CommonJS Promise 推奨ドキュメントに触発されており、非同期実行アクション結果オブジェクトと対話するためのインターフェイスとして Promise を使用します。これは、指定された時間内に完了する可能性がありますが、完了しない場合もあります (タイムアウト、エラー、傍受など)。
エラー処理の観点から見ると、非同期プログラミングの遅延 (deferred ) および Promise (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); });
を参照してください。
遅延 API | 遅延 API
Defered オブジェクトメソッド
Promise インターフェイス | Promise API
Promise オブジェクトの目的は、遅延タスクが完了したときに、関心のある部分がその実行結果を取得できるようにすることです。
Promise オブジェクトのメソッド
Promise チェーン | Promise のチェーン
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 中国語 Web サイトの他の関連記事を参照してください。