Пошук джерела неприйнятого відхилення обіцянки: TypeError: Цикл ланцюга виявлений для обіцянки


11

Я намагаюся знайти джерело безперебійної відмови від Обіцянки в Node.js

Я спробував модернізувати версію Node 12, використовуючи --async-stack-tracesпараметр, і слухати їх, використовуючи:

process.on("unhandledRejection",( reason, promise ) => {
  console.log(reason);
  console.log(promise);
});

Але я все ще не бачу жодного корисного сліду стека, який би міг допомогти мені знайти винуватця!

UnhandledPromiseRejectionWarning: TypeError: Chaining cycle detected for promise #<Promise>
    at process._tickCallback (internal/process/next_tick.js:68:7)
(node:89675) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 11)

Запуск Node v10.10.0


Чи багато обіцянок?
Prabhjot Singh Kainth

4
Помилка у вашому коді є циклічним ланцюжком, як і у вас const cyclic = Promise.resolve().then(()=>cyclic);, тому не шукайте неподілене відхилення обіцянки, це у внутрішньому коді вузла.
Каїдо

1
Деякі коди, що піднімають проблему, були б корисні.
x00

запуск npm i bluebirdта додавання const Promise = require('bluebird')до коду може дати вам більш детальне повідомлення про помилку
n3ko

спробуйте запустити вузол із --trace-warnings, не оброблені відхилення супроводжуються попередженнями, які можна простежити
Карен Григорян

Відповіді:


2

Якщо ви пропустили корисну стек-трек, ви можете змусити вузол створити новий, повторно кинувши помилку в обробник так:

process.on('unhandledRejection', (reason, p) => { throw reason });

Таким чином, ви зможете знайти винуватця.


Я просто спробую ще раз на своєму боці, і це безумовно спрацьовує.
Гоміно

@d -_- b вам вдалося перевірити це на вашому боці?
Гоміно

Привіт @Gomino, так, на жаль, це не спрацювало за моїм сценарієм, але я ціную вашу допомогу тут!
d -_- b

0

дякую за всі пропозиції. Я спробував ще раз, оновивши до останнього Вузла, 12.14.1і, нарешті, зміг його отримати, щоб показати слід стека:

Я використовував node --async-stack-traces myScript.jsспільно з:

process.on('unhandledRejection', (reason, p) => {
  console.log(reason);
});

І виявив помилку.


Чи не вузол 12 записує причину необробленого відхилення навіть без цього обробника подій?
Бергі

Ви навіть не спробували запропонованого мною рішення?
Гоміно

-1

Щоб знайти хороший слід стека для цього коду const cyclic = Promise.resolve().then(() => cyclic); я вкладаю цей код у файл prromise_cycle.jsі запускаю з інспектором, щоб налагодити його.

Я налагоджую його на Chrome DevTools з Pause on caught exceptionsувімкненим прапором , і тоді я бачу весь слід стека з моїм файлом на ньому

введіть тут опис зображення

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.