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,这比承诺更简单。谢谢。我会查找承诺。