请参考图片attached。
这是我的第一个节点应用程序/脚本,我试图理解为什么在结尾附加.then(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
答案 0 :(得分:0)
第一个调用“ r.getSubreddit(...)。getTop(...)。map(..)”正在返回承诺。因此,您可以拨打“ .then(console.log)”
“。then”说:“一旦实现了诺言,或者换句话说,当getSubreddit的调用完成时,请执行此操作。
当您说“ console.log(list)”时,您要求输入的值可能存在或可能不存在。您创建了Promise,JavaScript会立即调用下一个调用,即您的console.log,并且列表仍在等待Promise解析。当您使用.then()时,您说的是“等待这个承诺解决,然后再控制台输出日志。”
答案 1 :(得分:0)
似乎您正在使用snoowrap
,并且根据source code(请参见snoowrap.js),getTop()
返回Promise,这意味着您必须附加then
声明。如果getTop()
返回了一个数组,则可以像平时那样锁住map语句,但没有,它返回一个Promise。
尝试一下:
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都说了什么。由于您使用的是Promises,因此获取Subreddit的操作是异步的,这就是为什么您必须将所有命令链接在一起的原因,每个步骤何时完成。因此,要记录实际结果,必须 在then
语句中。
我建议在Promises上做一些功课:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises
编辑:
由于snoowrap在Promise的幕后使用了Bluebird,所以我可能是错的,实际上,您可以像以前那样使用map,因为Bluebird includes this. 有趣的是,该库使用的Promises是通常Promise对象的包装。也许他们没有正确实现该包装器,将其用作设计不正确的代理,类似于此问题中的问题:
TypeError: 'ownKeys' on proxy: trap result did not include 'arguments'