我试图理解为什么这些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
?
背景:我不认为我的直接实际目标对回答这个问题很重要。但在这里,你以防万一。我不知道库本身有什么影响最终例子的输出。这是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())
答案 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中打破了很多东西。