Как найти, где было создано обещание?

Я опубликовал этот вопрос пару дней назад, затем удалил его после того, как мне указали, что он по сути не демонстрирует проблему, с которой я столкнулся. Затем меня попросили восстановить вопрос, но мне все равно пришлось изменить его, чтобы четко показать проблему, которая у меня возникла.


С помощью обещаний JavaScript в его «разрешенном обработчике» как найти (если вообще возможно), где было создано это конкретное обещание?

Например. в этой ситуации с этим кодом (с async/await, похоже, нет никакой разницы), когда выполнение кода остановлено на операторе debugger, как увидеть, где было создано соответствующее обещание:

'use strict';

const promise = getPromise();
handleResolution(promise);

function handleResolution(promiseArg) {
  promiseArg
  .then((resolution) => {
    debugger;
    console.info(`resolved with: ${ resolution }`);
  });
}

function getPromise() {
  return new Promise((resolve) => {
      resolve('in getPromise()');
  });
}

Вряд ли здесь можно использовать стек вызовов, поскольку очевидно, что стека вызовов, в котором был выполнен тот или иной асинхронный вызов, давно нет.

Есть ли что-то вроде способа увидеть «цепочку обещаний»?

Вопрос касается JS в целом, а не обязательно Node.js, инструментов разработки Chrome и т. д. Так уж получилось, что я использовал этот стек для этого примера.

По сути ваш вопрос: почему отладчик не показывает, где создается новый объект Promise. Это похоже на вопрос, почему отладчик не показывает, где был создан какой-либо объект. Как выглядит ваша версия async/await? В этом примере должно быть намного яснее

Andrew Parks 16.06.2024 23:56

@AndrewParks Думаю, ты прав. это можно свести к why the debugger doesn't show where any object was created. Единственное возражение, которое у меня есть, заключается в том, что с обещаниями все более актуально и немного по-другому. «Любой объект» каким-то образом представляется как идентификатор. Таким образом, этот идентификатор можно найти в этом блоке кода или в стеке вызовов. Итак, понятно (по крайней мере, кажется), как получить «любой объект». А вот с промисами, потому что нет возможности обойти стек вызовов — их сложно найти.

d.k 17.06.2024 00:09

@AndrewParks Я перепишу вопрос. Я вижу, что здесь на самом деле легко найти обещание через стек вызовов. Мне нужно повторить ситуацию, с которой я столкнулся сегодня.

d.k 17.06.2024 00:14
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
3
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Нет, это вообще невозможно.

Для обработчика асинхронного разрешения есть три «состояния стека вызовов», которые могут представлять интерес:

  • тот, где было создано обещание: new Promise()
  • тот, к которому был прикреплен обработчик: .then()
  • тот, где было выполнено обещание: resolve()

Только второй доступен в ваших инструментах разработки как стек асинхронных вызовов , который также виден на вашем скриншоте. Это также соответствует трассировке асинхронного стека , которую вы получите при использовании await , где это буквально стек приостановленных функций, ожидающих возобновления, что делает этот выбор более эффективным.

Обычно это еще и самое интересное и полезное. Место (вызов функции, getPromise() в вашем примере), где было создано обещание, обычно находится недалеко, и если вам действительно нужно, вы можете разместить там точку останова, чтобы перейти к созданию обещания, что также должно привести вас к коду. который разрешает обещание (внутри исполнителя, resolve('in getPromise') в вашем примере).

Сохранение трассировок стека также для двух других случаев требует больше затрат (с точки зрения памяти), и, учитывая, что они образуют своего рода древовидную структуру, а не простой связанный список, также будет сложно отобразить в пользовательском интерфейсе devtools в понятном формате.

спасибо за ответ, постараюсь просмотреть к понедельнику, пока ничего толкового сказать не могу

d.k 19.06.2024 13:24

Другие вопросы по теме

Использование Redis со сложными запросами
Рабочие функции не найдены. Попробуйте сделать свои классы и методы заданий общедоступными (NODEJS v4)
Сторонние файлы cookie будут заблокированы – предупреждение, невозможно выйти из системы
Приложению RAG не удается использовать DataAPIClient: «Ошибка загрузки клиента fetch-h2 для DataAPIClient... попробуйте установить для httpOptions.client значение «fetch»»
Aws Redis Connection не проходит аутентификацию через NodeJS
Flash-сообщение не отображается после выхода из системы
Использование переменных окружения действий github для запуска различных базовых URL-адресов в функции и промежуточной стадии для теста Snowflake Cypress
Порядок импорта конфигурации puppeteer вызывает ошибку
Как дождаться, пока все сжатые файлы будут извлечены
Ошибка Angular 18 и SignalR при создании приложения: [ОШИБКА] Не удалось разрешить «url», «https», «http», «util» из источника событий