Я смотрел this Учебник AngularJS, описывающий, как подключиться к Twitter с ресурсом Angular. (Видеоурок) Вот ресурс, который настроен в примере контроллера:
$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);
});
Я понимаю этот метод. Это имеет для меня смысл. Ресурс представляет собой место в Интернете, где вы можете получить данные, а get
просто делает вызов ajax на url, возвращает json и вызывает функцию обратного вызова с помощью json. Параметр result
- это json.
Это имеет смысл для меня, потому что кажется очевидным, что это асинхронный вызов. То есть под капотом запускается вызов ajax, а код, следующий за вызовом, не блокируется, он продолжает выполняться. Затем в какой-то неопределенной точке позже, когда xhr будет успешным, вызывается функция обратного вызова.
Затем в учебнике показан другой метод, который выглядит намного проще, но я не понимаю, как он работает:
$scope.twitterResult = $scope.twitter.get();
Я предполагаю, что xhr под get
должен быть асинхронным, но в этой строке мы присваиваем возвращаемое значение вызова get
переменной, как если бы она возвращалась синхронно.
Неужели я ошибаюсь, потому что не понимаю этого? Как это возможно? Я думаю, что это действительно опрятно, что это работает, я просто не понимаю.
Я понимаю, что get
может возвращать что-то, в то время как xhr под ним отключается и обрабатывается асинхронно, но если вы будете следовать примеру кода самостоятельно, вы увидите, что $scope.twitterResult
получает фактическое содержимое твиттера перед выполнением любых последующих строк, Например, если вы пишете console.log($scope.twitterResult)
сразу после этой строки, вы увидите результаты твиттера, зарегистрированные в консоли, а не временное значение, которое будет заменено позже.
Что еще более важно, поскольку это возможно, как я могу написать службу Angular, которая использует эту же функциональность? Помимо аякс-запросов, существуют другие типы хранилищ данных, требующих асинхронных вызовов, которые могут использоваться в JavaScript, которые я бы хотел написать синхронно в этом стиле. Например, IndexedDB. Если бы я мог окутать голову, как это делают Angular встроенные ресурсы, я бы дал ему шанс.