Angular リソースを使用して Twitter に接続する方法を説明しているこのAngularJS チュートリアルを見ていました。(ビデオ チュートリアル) サンプル コントローラーで設定されるリソースは次のとおりです。
$scope.twitter = $resource('http://twitter.com/:action',
{action: 'search.json', q: 'angularjs', callback: 'JSON_CALLBACK'},
{get: {method: 'JSONP'}});
このチュートリアルでは、呼び出しを使用してリソースからデータを取得する方法がいくつかあることを示していget
ます。最初の方法は、コールバックを get 関数に渡すことです。コールバックは、ajax リクエストが返された後、結果とともに呼び出されます。
$scope.twitter.get(function(result) {
console.log('This was the result:', result);
});
私はこの方法を理解しています。それは私にとって完全に理にかなっています。リソースは、データを取得できる Web 上の場所を表し、get
単純に URL に対して ajax 呼び出しを行い、json を取得し、json でコールバック関数を呼び出します。パラメータはそのresult
jsonです。
これが非同期呼び出しであることは明らかなので、私には理にかなっています。つまり、内部では ajax 呼び出しが発生し、呼び出しに続くコードはブロックされずに実行され続けます。その後、不確定な時点で xhr が成功すると、コールバック関数が呼び出されます。
次に、チュートリアルは、はるかに単純に見える別の方法を示していますが、それがどのように機能するかわかりません:
$scope.twitterResult = $scope.twitter.get();
下の xhrget
は非同期である必要があると想定していますが、この行では、get
呼び出しの戻り値を、あたかも同期的に返されるかのように変数に割り当てています。
これを理解していないのは間違っていますか?そんなことがあるものか?それが機能するのは本当に素晴らしいことだと思いますが、わかりません。
その下の xhr がオフになって非同期に処理されている間に何かget
を返すことができることは理解していますが、コード例を自分で従うと、後続の行が実行される前に実際の twitter コンテンツを取得することがわかります。たとえば、その行の直後に書き込むと、後で置き換えられる一時的な値ではなく、コンソールに記録された twitter の結果が表示されます。$scope.twitterResult
console.log($scope.twitterResult)
さらに重要なことは、これが可能であるため、これと同じ機能を利用する Angular サービスを作成するにはどうすればよいでしょうか? ajax リクエスト以外にも、JavaScript で使用できる非同期呼び出しを必要とする他の種類のデータ ストアがあり、このスタイルで同期的にコードを記述できるようになりたいと思っています。たとえば、IndexedDB です。Angular の組み込みリソースがどのように機能しているかを把握できれば、試してみたいと思います。