为什么我不能在渗透实例中使用Promise.resolve?

时间:2016-11-21 08:58:09

标签: node.js promise es6-promise console.log

我试图理解为什么这些console.log语句的行为不同。我希望它们的行为相同:

使用节点7.考虑以下情况:

1。 Promise.resolve(对象)

Promise.resolve按照我的预期处理对象:

Promise.resolve({ a: `hello` }).then(console.log) // { a:'hello' }

2。直接console.log来自库的类实例。

如果我存储Osmosis实例,我可以控制它。记录它:

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())

1 个答案:

答案 0 :(得分:2)

文档非常糟糕,使用的技术非常传统。 new osmosis.get(url)返回的内容不是Osmosis个实例,而是Command个实例。那些确实有then method

当你将某些内容传递给Promise.resolve时,它会被测试为thenable,如果它看起来像是一个承诺,它会被尝试同化:回调传递给{{ 1}}将解决新承诺的方法。

因此,当您执行then时,您将获得一个未解决的承诺,该承诺将在调用Promise.resolve(new osmosis.get(url))回调时实现(运行该命令时会发生这种情况)。在你的情况下,它永远不会。

解决您的特定问题的方法是不要使用promises(因为您没有做任何异步操作):

then

但你可能还应该报告一个错误,definePath(defineSearch(new osmosis.get(url))).run()) 看起来像是正确的承诺,这在ES6中打破了很多东西。