Немного поздно, но вот что я сделал для перечислений (может быть и для любого объекта) и получения значения атрибута описания с помощью расширения (это может быть общим для любого атрибута):
public enum TransactionTypeEnum
{
[Description("Text here!")]
DROP = 1,
[Description("More text here!")]
PICKUP = 2,
...
}
Получение значения:
var code = TransactionTypeEnum.DROP.ToCode();
Расширение, поддерживающее все мои перечисления:
public static string ToCode(this TransactionTypeEnum val)
{
return GetCode(val);
}
public static string ToCode(this DockStatusEnum val)
{
return GetCode(val);
}
public static string ToCode(this TrailerStatusEnum val)
{
return GetCode(val);
}
public static string ToCode(this DockTrailerStatusEnum val)
{
return GetCode(val);
}
public static string ToCode(this EncodingType val)
{
return GetCode(val);
}
private static string GetCode(object val)
{
var attributes = (DescriptionAttribute[])val.GetType().GetField(val.ToString()).GetCustomAttributes(typeof(DescriptionAttribute), false);
return attributes.Length > 0 ? attributes[0].Description : string.Empty;
}
В вашем первом методе request.get
вызывается внутри рекурсивной функции getPageOfThreadsWithRetry
. Но в вашем втором методе request.get
вызывается вне рекурсивной функции retryPromise
.
Я бы порекомендовал вам изменить подпись retryPromise
на что-то вроде
function retryPromise(promiseCreator, retries, delay, delayMultiplier) {
return new Promise((resolve, reject) => {
promiseCreator()
.then(resolve)
.catch((err) => {
if (retries == 0) {
reject(err);
} else {
let retryFunc = function() {
retries--;
delay = delay * delayMultiplier;
resolve(retryPromise(promiseCreator, retries, delay, delayMultiplier));
}
setTimeout(retryFunc, delay);
}
});
});
}
и использовать его как
function getPageOfThreadsWithRetry(access_token, nextPageToken) {
let promiseCreator = () => getPageOfThreads(access_token, nextPageToken);
return retryPromise(promiseCreator, retries, delay, delayMultiplier);
}