NodeJS получение результата Promise из консоли - PullRequest
1 голос
/ 18 апреля 2020

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

например.

let promise = new Promise(() => {
  console.log('my promise');
}
promise.then(() => { console.log('resolved') })
// returns a Promise {<pending>}

await promise.then(() => { console.log('resolved') })
// still returns just a Promise

(async () => {
    await promise
})()
// still returns ... just a Promise

В конечном итоге я пытаюсь проверить результаты обещания ( запросов к базе данных) из консоли моего узла в точке останова, и я просто продолжаю возвращать Promises.


UPDATE - Я думаю, это сложнее, чем я думал. Потому что знаю, что можно было ответить.

Я понимаю, как получить результаты обещания в обычной среде. Я говорю о получении результатов в точке останова при отладке приложения Node. Чтобы подключиться к консоли, к которой я обращаюсь, выполните следующие действия: https://medium.com/@paul_irish / debugging- node-js -nightlies-with- chrome -devtools-7c4a1b95ae27

Из консоль в DevTools, обещания продолжают возвращаться Promise {}. Я не знаю, возможно ли получить значение обещания, но если кто-то знает, пожалуйста, дайте мне знать.

Ответы [ 3 ]

0 голосов
/ 19 апреля 2020

Положение ваших точек останова имеет значение, и поведение будет таким же в отладчике Node.js и отладчике браузера.

В дальнейшем я использую метки типа <b1> для определения позиций точек останова.

1.  const p1 = new Promise((resolve) => <b1> resolve('result 1'))
2.  <b2>
3.  const p2 = p1.then(() => <b3> 'result 2')
4.  <b4>

При <b1>, p1 не будет объявлено, поскольку функция исполнителя выполняется синхронно, а процесс объявления переменной еще не завершен.

При <b2>, p1 будет выполненным обещанием (Promise {<fulfilled>: "result 1"}), разрешенным со значением 'result 1', так как в функции-исполнителе было вызвано разрешение.

Следующая точка останова, которая будет достигнута, будет <b4>. Примечание: не <b3>.

При <b4>, p2 будет ожидающим обещанием (Promise {<pending>}) , потому что обещание было настроено с .then, который еще не имел возможности запускаться. .then обратные вызовы выполняются на асинхронных микрозадачах, чтобы дать программисту возможность настроить цепочку обещаний перед ее выполнением. В конце концов, обещания предназначены для использования с асинхронным поведением.

В следующей доступной микрозадаче будет выполняться вызов <b3> при выполнении обратного вызова .then. На <b3> значения p1 и p2 остаются без изменений. p1 был выполнен ранее и не изменится. Состояние p2 не изменилось, поскольку .then, с которым он был настроен, еще не завершил работу.

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

let p1 = new Promise((resolve) => resolve('result 1'))
const p2 = p1.then(() => 'result 2')
p2.then(() => {
  // here `p2` === `Promise {<resolved>: "result 2"}`
  console.log(p2)
})
0 голосов
/ 20 апреля 2020

Из комментариев я думаю, что невозможно получить результаты асинхронного вызова, находясь в точке останова в JavaScript.

Если кто-то придет сюда и захочет получить возможность выполнять запросы БД из консоли Node (REPL), как я искал, я бы порекомендовал перейти сюда:

https://medium.com/@vemarav / build-rails-like-console-in- nodejs -repl-2459fb5d387b

0 голосов
/ 19 апреля 2020

при создании объекта обещания вы должны использовать этот синтаксис

var promiseObj = new Promise(executor);

исполнитель является функцией с этой подписью

function(resolutionFunc, rejectionFunc){
    // typically, some asynchronous operation.
} 

Когда мы go вернемся к вашим данным c Например, вы можете определить его как

let promise = new Promise( resolve => {
    resolve("my promise")
})

Примечание Я не добавил функцию отклонения

, тогда вы можете сделать

promise.then(value => console.log(value))

Вы можете найти подробное описание здесь

...