Есть ли способ оценить обещание в 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;
...
})
}