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



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Нет, это вообще невозможно.
Для обработчика асинхронного разрешения есть три «состояния стека вызовов», которые могут представлять интерес:
new Promise().then()resolve()Только второй доступен в ваших инструментах разработки как стек асинхронных вызовов , который также виден на вашем скриншоте. Это также соответствует трассировке асинхронного стека , которую вы получите при использовании await , где это буквально стек приостановленных функций, ожидающих возобновления, что делает этот выбор более эффективным.
Обычно это еще и самое интересное и полезное. Место (вызов функции, getPromise() в вашем примере), где было создано обещание, обычно находится недалеко, и если вам действительно нужно, вы можете разместить там точку останова, чтобы перейти к созданию обещания, что также должно привести вас к коду. который разрешает обещание (внутри исполнителя, resolve('in getPromise') в вашем примере).
Сохранение трассировок стека также для двух других случаев требует больше затрат (с точки зрения памяти), и, учитывая, что они образуют своего рода древовидную структуру, а не простой связанный список, также будет сложно отобразить в пользовательском интерфейсе devtools в понятном формате.
спасибо за ответ, постараюсь просмотреть к понедельнику, пока ничего толкового сказать не могу
По сути ваш вопрос: почему отладчик не показывает, где создается новый объект Promise. Это похоже на вопрос, почему отладчик не показывает, где был создан какой-либо объект. Как выглядит ваша версия async/await? В этом примере должно быть намного яснее