Получите оригинальное имя функции из обещания.

1

У меня есть функция, которая возвращает обещание, как это. .catch callback (.then или .catch, я хочу, чтобы можно было найти имя оригинальной функции ("myFunction"). Как я могу это сделать?

function myFunction() {
  return fetch('https://example.com')
    // The promise will fail because Stackoverflow is sandboxed
    .catch(function() {
      console.log(JSON.stringify(arguments.callee.name))
      // It is returning the name of my anonymous function ("").
      // I want it to log "myFunction" instead.
    })
}

myFunction();
  • 1
    Я изо всех сил пытаюсь увидеть вариант использования или цель того, зачем вам это нужно.
  • 0
    @CharlieFish Функция handleError вызывается внутри .then . Я предоставляю функции инструкции о том, как снова вызвать исходную функцию. Поэтому мне нужно предоставить имя функции и аргументы.
Показать ещё 6 комментариев
Теги:
function
promise

2 ответа

3

Вы можете просто сохранить arguments в другую переменную за пределами закрытия catch.

function myFunction() {
  let args = arguments;
  return fetch('https://example.com')
    // The promise will fail because Stackoverflow is sandboxed
    .catch(function() {
      console.log(JSON.stringify(args.callee.name))
      // It is returning the name of my anonymous function ("").
      // I want it to log "myFunction" instead.
    })
}

myFunction();
  • 2
    Возможно, стоит упомянуть, что это устарело: stackoverflow.com/questions/103598/…
  • 1
    @ nem035 Спасибо, я тоже это заметил. Прочитайте немного и добавьте это к сообщению, если это связано
Показать ещё 1 комментарий
2

Нет никакого способа сделать это, что работает в строгом режиме и не устаревает (как сказал Чок). Это довольно преднамеренно и сделано для того, чтобы предотвратить возможные утечки и включить такие вещи, как SES. Он также ломается с помощью мини-экскаваторов.

По словам Choz, уже есть хороший ответ, объясняющий, как это сделать в свободном режиме и в старых средах.

Это можно получить из трассировки стека с помощью стеков асинхронного стека при использовании асинхронных функций (используя new Error().stack), Который гарантированно работает и является будущим доказательством. Тем не менее, нет планов разрабатывать трассировки стека асинхронного вызова для обещаний, когда не использовать async-ждут, а трассировки стека асинхронного вывода для производства буквально высадились на V8 на прошлой неделе, поэтому потребуется время, прежде чем оно станет пригодным для использования.

Если вы используете babel или TypeScript, это также можно сделать с помощью преобразования кода и плагина.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню