Функции стрелок - наиболее широко используемая функция ES6 до сих пор ...
blockquote>Использование: все функции ES5 должны быть заменены функциями стрелок ES6, за исключением следующих сценариев:
Функции стрелок НЕ должны использоваться:
- Когда мы хотим, чтобы функция hoisting как функции стрелок была анонимной.
- Когда мы хотим использовать
this
/arguments
в функции, поскольку функции стрелки не имеютthis
/arguments
, они зависят от их внешнего контекста.- Когда мы хотим использовать именованную функцию, поскольку функции стрелок анонимны.
- Когда мы хотим использовать функцию как
constructor
, поскольку функции стрелки не имеют своихthis
.- Когда мы хотим добавить функцию как свойство в объектный литерал и использовать в ней объект, поскольку мы не можем получить доступ к
this
(который должен быть самим объектом).Давайте рассмотрим некоторые из вариантов функций стрелок, которые лучше понять:
Вариант 1: Когда мы хотим передать более одного аргумента функции и вернуть некоторые
Версия ES5 :
var multiply = function (a,b) { return a*b; }; console.log(multiply(5,6)); //30
Версия ES6 :
var multiplyArrow = (a,b) => a*b; console.log(multiplyArrow(5,6)); //30
Примечание: ключевое слово
function
НЕ требуется.=>
требуется.{}
являются необязательными, когда мы не предоставляем{}
return
неявно добавляется JavaScript, и когда мы предоставляем{}
, нам нужно добавитьreturn
, если нам это нужно.Вариант 2: Если мы хотим передать ТОЛЬКО один аргумент функции и вернуть некоторое значение из него.
Версия ES5 :
var double = function(a) { return a*2; }; console.log(double(2)); //4
Версия ES6 :
var doubleArrow = a => a*2; console.log(doubleArrow(2)); //4
Примечание: при передаче только одного аргумента мы можем опустить скобки
()
.Вариант 3: когда мы НЕ хотим передавать какие-либо аргумент функции и НЕ хотите возвращать какое-либо значение.
Версия ES5 :
var sayHello = function() { console.log("Hello"); }; sayHello(); //Hello
Версия ES6 :
var sayHelloArrow = () => {console.log("sayHelloArrow");} sayHelloArrow(); //sayHelloArrow
Вариант 4: Если мы хотим явно вернуться из функций стрелок.
Версия ES6 :
var increment = x => { return x + 1; }; console.log(increment(1)); //2
Вариант 5: Когда мы хотим вернуть объект из функций стрелок.
Версия ES6 :
var returnObject = () => ({a:5}); console.log(returnObject());
Примечание: нам нужно обернуть объект в скобки
()
, в противном случае JavaScript не может различать блок и объект.Вариант 6: Arro w не имеют
arguments
(массив, такой как объект), они зависят от внешнего контекста дляarguments
.Версия ES6 :
function foo() { var abc = i => arguments[0]; console.log(abc(1)); }; foo(2); // 2
Примечание:
foo
- это функция ES5 с массивомarguments
, подобным объекту, и переданный ему аргумент2
, поэтому дляfoo
дляarguments[0]
установлено значениеarguments[0]
.
abc
- это функция стрелок ES6, так как у нее нет ееarguments
, поэтому она выводитarguments[0]
вfoo
, это внешний контекст.Вариант 7: Функции стрелки НЕ имеют
this
, они зависят от внешнего контекста дляthis
Версия ES5 :
var obj5 = { greet: "Hi, Welcome ", greetUser : function(user) { setTimeout(function(){ console.log(this.greet + ": " + user); // "this" here is undefined. }); } }; obj5.greetUser("Katty"); //undefined: Katty
Примечание. Обратный вызов, переданный setTimeout, является ES5 и имеет свой собственный
this
, который не определен в средеuse-strict
, поэтому мы получаем выход:undefined: Katty
Версия ES6 :
var obj6 = { greet: "Hi, Welcome ", greetUser : function(user) { setTimeout(() => console.log(this.greet + ": " + user)); // this here refers to outer context } }; obj6.greetUser("Katty"); //Hi, Welcome: Katty
Примечание. Обратный вызов, переданный в
setTimeout
, является функцией стрелок ES6, и у него нет своегоthis
, поэтому он берет его из внешнего контекста, который являетсяgreetUser
, который имеетthis
, который являетсяobj6
, следовательно мы получаем выход:Hi, Welcome: Katty
Разное: мы не можем использовать функцию
new
со стрелками. Функции стрелки не имеют свойстваprototype
. У нас нет привязкиthis
, когда функция стрелки вызывается черезapply
илиcall
.
Как сказали бы британцы: «Горе!»
TL; DR
Попробуйте:
using Microsoft.Azure.Management.ResourceManager.Fluent;
...
var rm = ResourceManager.
.Configure()
.WithLogLevel(HttpLoggingDelegatingHandler.Level.Basic)
.Authenticate(credentials)
.WithDefaultSubscription();
var resources= rm.GenericResources.List();
foreach(IGenericResource res in resources)
{
....
}
TL; DR 2
Некоторые комментарии указывают на метод расширения ResourceOperationsExtensions.List . Для этого требуется экземпляр IResourceOpearations
. Это доступно через IResourceManagementClient.Resources . Это доступно через свойство ResourceManager.Inner :
var rmOps=rm.Inner.Resources;
var resources = rmOps.List(someODataQuery);
Длинная версия
Управление Azure работает путем предоставления интерфейсов REST. В конце концов, и Azure SDK, и командлеты Powershell будут вызывать этот интерфейс REST. Вы можете использовать Fiddler
или другой прокси-сервер отладки для захвата и повторного использования
Командлеты Powershell реализованы поверх SDK, что означает, что вы можете просматривать сам исходный код . [1134 ]
Командлет использует метод ListResources класса класса ResourceManagerSdkClient с запросом OData, созданным из его параметров:
result = this.ResourceManagerSdkClient.ListResources(odataQuery);
К сожалению, это не помогает командлеты используют свои собственные низкоуровневые абстракции, в то время как библиотеки Azure RM используют различные абстракции и интерфейсы. ListResources
говорит нам, что нам нужно запросить GenericResource.
Репозиторий библиотек Azure Resource Manager размещен на Github. Документация не показывает, как добраться до ResourceManager . Поиск в самом репо показывает, как ResourceManager
используется в тестах .
ResourceManager.GenericResources предоставляет доступ к тем же универсальным ресурсам, которые использует команда Powershell. Тип этого свойства - IGenericResources , который, в свою очередь, реализует ISupportsListing , который дает нам доступ к List
. интерфейсы явно реализованы. Код может нуждаться в явном приведении.
IGenericResources
также реализует ISupportsListingByResourceGroup
и ISupportsListingInResourceGroupByTag
, которые можно использовать для поиска по группам ресурсов и тегам.
Поиск в Google по ResourceManager.GenericResources
или GenericResources.List()
и т. Д. Не дает соответствующих результатов. Термины слишком ... общие.