NodeJS 从控制台获取 Promise 结果

NodeJS getting Promise result from Console

如果我想从我的节点测试控制台获取 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

最终,我尝试在断点处从我的节点控制台测试承诺结果(数据库查询),并且我只是不断返回承诺。


UPDATE - 我想这比我想象的要复杂。因为知道一个已经能回答了。

我了解如何在常规环境中获取承诺的结果。我说的是在调试 Node 应用程序时在断点处获取结果。要连接到我所指的控制台,请按照以下说明操作: https://medium.com/@paul_irish/debugging-node-js-nightlies-with-chrome-devtools-7c4a1b95ae27

在 DevTools 的控制台中,promise 不断返回 Promise {}。我不知道是否有可能获得承诺的价值,但如果有人知道任何一种方式,请告诉我。

当你创建一个 promise 对象时,你应该使用这个语法

var promiseObj = new Promise(executor);

执行器是具有此签名的函数

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

当我们回到您的具体示例时,您可以将其定义为

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

注意我没有添加拒绝功能

那么你可以

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

你可以找到详细的描述here

断点的位置很重要,在 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会被取消声明,因为执行器函数运行s是同步的,变量声明过程还没有完成。

<b2>p1 将是一个 fulfilled promise (Promise {<fulfilled>: "result 1"}),使用值 'result 1' 解决,因为在执行函数中调用了 resolve。

下一个断点是<b4>. 注意:不是 <b3>.

<b4>p2 将是一个未决的承诺(Promise {<pending>}因为承诺已经配置了一个 .then 还没有然而有机会 运行. .then 回调是 运行 在异步微任务上,让程序员有机会在执行之前配置承诺链。毕竟,promise 设计用于异步行为的。

在下一个可用的微任务中,<b3> 将被命中,因为 .then 回调是 运行。在 <b3> 处,p1p2 的值保持不变。 p1 之前已经完成,不会改变。 p2 的状态没有改变,因为它配置的 .then 还没有完成 运行ning.

为了观察 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)
})

从评论中我猜想在 JavaScript.

中的断点处无法获得异步调用结果

如果有人来到这里并想要一种能够像我一直在寻找的那样从 Node 控制台 (REPL) 进行数据库查询的方法,我建议去这里:

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