Есть ли способ оценить обещание в nodejs без возобновления отладчика?

Если я набираю отладчик и хочу что-то проверить. Но вызов этой функции возвращает обещание, тогда я застрял.

Например:

Я набрал отладчик, и он остановился.

function test(db) {
    debugger;
    // here i want to see something
    var a = .....;
}

Но если я наберу

let d = db.User.create(); 

Я получу

Promise { pending }

сейчас нет выхода. Я не могу просто оценить обещание. Как бы сделать весь отладчик менее полезным.

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

Ответ 1

Пожалуйста, обратитесь https://gist.github.com/martinheidegger/4c2b7908005f65f9a53b25d5fec65f63 проверьте модуль debug-prom.js

'use strict'

var debug = require('./debug-promise')

debug.wrap(() => new Promise(() => {})).then(() => console.log('a executed'))
debug.wrap(() => Promise.resolve('x')).then(() => console.log('b executed'))


//
// This will output something like:
//
//   b executed
//   1 Promise is still unfullfilled!
//   --- (V347P-M6K) ---
//     at Object.<anonymous> (/debug-test2.js:5:7)
//     at Module._compile (module.js:571:32)
//     at Object.Module._extensions..js (module.js:580:10)
//   
//     CODE
//       () => new Promise(() => {})
//   
//   ---
//

Ответ 2

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

Например:

const createUser = async() => (
  let d = await db.User.create();
  debugger;
  return d;
)

при await ваша функция будет приостановлена, но при разрешении обещания отладчик автоматически возобновит работу, что даст вам возвращенное асинхронное значение.

Ответ 3

Chrome не так давно запустил async отладку в своих Chrome Devtools. Вам нужно включить флаг в Chrome, чтобы использовать его сейчас.

Проверьте эту хорошую статью здесь - https://www.html5rocks.com/en/tutorials/developertools/async-call-stack/

Ответ 4

Используйте отладчик в любом случае разрешения или отклонения обещания.

function test(db) {

   let d = db.User.create(); 

   d.then((result) => {
      debugger;
      ...
   },
   (e) => {
      debugger;
      ...
   })


}