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>
处,p1
和 p2
的值保持不变。 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
如果我想从我的节点测试控制台获取 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>
处,p1
和 p2
的值保持不变。 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