为什么.then(console.log)可以工作,但是常规console.log()却给出错误?

时间:2019-08-08 04:01:58

标签: javascript

请参考图片attached

这是我的第一个节点应用程序/脚本,我试图理解为什么在结尾附加.then(console.log):与仅使用console.log(list);时会得到不同的结果。

https://imgur.com/a/1kJ7gXX

如果未在此处加载图片,则为摘录

// 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

2 个答案:

答案 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'