Почему моя общая функция повтора Promise не ведет себя так, как моя?

Немного поздно, но вот что я сделал для перечислений (может быть и для любого объекта) и получения значения атрибута описания с помощью расширения (это может быть общим для любого атрибута):

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;
}
0
задан San Francisco Sunrise 5 March 2019 в 05:38
поделиться

1 ответ

В вашем первом методе 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);
}
0
ответ дан San Francisco Sunrise 5 March 2019 в 05:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: