Javascript 为什么.then(console.log)可以工作,但常规的console.log()会给出一个错误?
请参考图片 这是我的第一个节点应用程序/脚本,我试图理解为什么我在附加Javascript 为什么.then(console.log)可以工作,但常规的console.log()会给出一个错误?,javascript,Javascript,请参考图片 这是我的第一个节点应用程序/脚本,我试图理解为什么我在附加时会得到不同的结果。然后(console.log):在末尾,而不是我只使用console.log(list) 如果图像没有加载,这里是代码段 // Generate list const list = r.getSubreddit('AskReddit') .getTop({ time: 'all', limit: 1 }) .map(post => ({ title: post.tit
时会得到不同的结果。然后(console.log):
在末尾,而不是我只使用console.log(list)代码>
如果图像没有加载,这里是代码段
// Generate list
const list = r.getSubreddit('AskReddit')
.getTop({ time: 'all', limit: 1 })
.map(post => ({
title: post.title,
url: post.url,
upvotes: post.ups
}))
.then(console.log);
// console.log(list);
我收到以下错误消息:
internal/util/inspect.js:373
const symbols = Object.getOwnPropertySymbols(value);
^
TypeError: 'ownKeys' on proxy: trap result did not include 'prototype'
at Function.getOwnPropertySymbols (<anonymous>)
at getKeys (internal/util/inspect.js:373:26)
at formatRaw (internal/util/inspect.js:617:12)
at formatValue (internal/util/inspect.js:540:10)
at inspect (internal/util/inspect.js:197:10)
at Object.formatWithOptions (util.js:84:12)
at Console.(anonymous function) (internal/console/constructor.js:274:15)
at Console.log (internal/console/constructor.js:284:61)
at Object.<anonymous> (/Users/ik/Documents/Personal/list.js:27:9)
at Module._compile (internal/modules/cjs/loader.js:799:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:810:10)
at Module.load (internal/modules/cjs/loader.js:666:32)
at tryModuleLoad (internal/modules/cjs/loader.js:606:12)
at Function.Module._load (internal/modules/cjs/loader.js:598:3)
at Function.Module.runMain (internal/modules/cjs/loader.js:862:12)
at internal/main/run_main_module.js:21:11
internal/util/inspect.js:373
常量符号=Object.getOwnPropertySymbols(值);
^
TypeError:代理上的“ownKeys”:陷阱结果不包括“prototype”
在Function.getOwnPropertySymbols()处
在getKeys(internal/util/inspect.js:373:26)
at formatRaw(internal/util/inspect.js:617:12)
at formatValue(internal/util/inspect.js:540:10)
检查时(内部/util/inspect.js:197:10)
位于Object.formatWithOptions(util.js:84:12)
在控制台。(匿名函数)(internal/Console/constructor.js:274:15)
在Console.log(internal/Console/constructor.js:284:61)
反对。(/Users/ik/Documents/Personal/list.js:27:9)
at模块编译(内部/modules/cjs/loader.js:799:30)
在Object.Module.\u extensions..js(internal/modules/cjs/loader.js:810:10)
在Module.load(内部/modules/cjs/loader.js:666:32)
在tryModuleLoad(内部/modules/cjs/loader.js:606:12)
at Function.Module._load(内部/modules/cjs/loader.js:598:3)
位于Function.Module.runMain(internal/modules/cjs/loader.js:862:12)
在internal/main/run_main_module.js:21:11
第一个调用“r.getSubreddit(…).getTop(…).map(…)”正在返回一个承诺。这就是为什么您可以调用“.then(console.log)”的原因
“.then”表示“一旦承诺实现,或者换句话说,当来自getSubreddit的调用完成时,就执行此操作
当您说“console.log(list)”时,您要求的是一个可能存在或不存在的值。您创建了承诺,JavaScript立即调用下一个调用,即您的console.log,并且列表仍在等待承诺的解析。当您使用.then()时,您是说“在console.logging输出之前,等待此承诺得到解决。”您似乎正在使用snoowrap
,并且根据(请参见snoowrap.js),getTop()
返回一个承诺,这意味着您必须将语句附加到该承诺。如果getTop()
返回了一个数组,您可以像以前一样锁定map语句,但是它没有,它返回了一个承诺
试试这个:
const list = r.getSubreddit('AskReddit')
.getTop({ time: 'all', limit: 1 })
.then(console.log);
或使用地图:
const list = r.getSubreddit('AskReddit')
.getTop({ time: 'all', limit: 1 })
.then((topPosts) => {
return topPosts.map(post => ({
title: post.title,
url: post.url,
upvotes: post.ups
})
})
.then(console.log);
无论哪种方式,作为旁注,请注意之前的评论者对您的第二个console.log的评论。由于您使用的是Promissions,获取子Reddit的操作是异步的,这就是为什么您必须将所有命令链接在一起,在前一步完成后执行每一步。因此,要记录实际结果,它必须在然后
语句
我建议做一些关于承诺的家庭作业:
编辑:
既然snoowrap是在兜帽下用蓝鸟做承诺,我可能错了,事实上你可以用你的方式使用地图,因为
有趣的是,此库使用的Promission是普通Promise对象上的包装器。可能他们错误地实现了该包装器,将其用作未正确设计的代理,类似于此问题中的问题:
list
不是数组,而是承诺。至于错误,我想这与蓝鸟承诺的实现方式有关,这让他们很难天真地登录控制台。实际上,snoowrap
本身使用代理
作为方法链接语法,它们的实现不支持general检查对象。只需按照他们的文档适当地使用API。当您编写console.log(list)
时,您实际上是在记录对象(即Promise
)这封装了可能存在也可能不存在的值。但在这一点上,它肯定不存在。但所有这些都不能解释抛出错误的原因。感谢您的简单解释!我现在了解了两者之间的差异。不要忘记在答案上加一,并/或检查您认为正确的答案,以便作者获得credit、 我很高兴您能理解JavaScript的异步特性。请等到您使用async/Wait,这比承诺更简单。谢谢。我会查找承诺。