【发布时间】:2017-04-04 14:39:58
【问题描述】:
我试图理解为什么这些console.log 语句的行为不同。我希望它们表现相同:
使用节点 7。考虑以下情况:
1. Promise.resolve(object)
Promise.resolve 按我的预期处理对象:
Promise.resolve({ a: `hello` }).then(console.log) // { a:'hello' }
2。直接console.log 库中的类实例。
如果我存储一个 Osmosis 实例,我可以 console.log 它:
const osmosis = require(`osmosis`)
console.log(new osmosis.get(url))
/* { prev:
{ instance: Osmosis:1,
name: 'get',
args: [ 'http://www.google.com', , ],
getURL: [Function: getURLArg],
url: 'http://www.google.com',
params: undefined,
cb: [Function: Get],
next: [Circular] } }
*/
3. Promise.resolve(类实例)
但如果我尝试解析 Osmosis 实例,我看不到奇偶校验:
Promise.resolve(new osmosis.get(url)).then(console.log) // nothing
这里发生了什么?我对Promise.resolve()...有什么误解吗?还是console.log?
考虑到 [1] 中的行为,为什么 [3] 的日志记录与 [2] 不同?
背景:我认为我的直接实际目标对于回答这个问题并不重要。但在这里你去以防万一。我看不出库本身会如何影响最终示例的输出。这是new osmosis.get() 上的文档:http://rchipka.github.io/node-osmosis/Osmosis.html#toc1__anchor
new osmosis.get(url) 不执行异步 http 请求。它实例化了一个刮板实例,该实例可以使用一组声明性指令构建,并被告知在以后的任意时间“运行”。
出于几个原因,我希望能够在承诺链中构建这组指令。
主要的一个是将指令定义分解为更易于测试和理解的不同功能的最简单方法。例如而不是osmosis.get(url).set({some stuff}).find(@something),我想:
function defineSearch(instance){
return instance.set({some stuff})
}
function definePath(instance) {
return instance.find(@something)
}
Promise.resolve(new osmosis.get(url))
.then(defineSearch)
.then(definePath)
.then(instance => instance.run())
【问题讨论】:
-
通过在
Promise.resolve()中包装一个对象,您实际上想完成什么?如果您希望它会等到某些异步操作完成,那不是 Promise 的工作方式。在这种情况下,将您的操作包装在Promise.resolve()中并不能真正帮助您。 -
如果有帮助,我在上面添加了一些上下文。但在这个问题的情况下,我实际上只是想了解为什么 console.log 打印为空。
-
@Benjamin Gruenbaum 但是为什么我可以直接
console.log一个新实例,却永远看不到通过Promise.resolve传递的实例?这不是回调的问题。我对Promise.resolve上下文之外的new osmosis实例具有直接、即时、同步的访问权限。 -
以防万一... catch 调用
osmosis... 可能osmosis.get正在引发异常,因此无法到达then()子句跨度>
标签: node.js promise es6-promise console.log