试图理解普通 JS 中的承诺行为

Trying to understand promises behaviour in vanilla JS

我正在尝试编写一个脚本来检查无效的 JSON 字符串,然后抛出一个错误,然后我可以在控制台中登录。我为此使用了 promises(为了更好地理解它们是如何工作的)。

function parsePromised(value) {
  var promise = new Promise(
    function(fulfilled, rejected) {
      try {
        JSON.parse(value)
      } catch (e) {
        rejected(e)
      }
      fulfilled('fulfilled')
    }
  )
  console.log(promise)
  return promise;
}

parsePromised('{"1": 1, "2": 2, "3": {"4": 4, "5": {"6": 6}}}').then(console.log);

出于我不明白的原因,控制台 returns 我三行(两行用于我脚本中的 console.log,另一行有错误)。这是:

Promise {[[PromiseStatus]]: "resolved", [[PromiseValue]]: "fulfilled"}

Promise {[[PromiseStatus]]: "pending", [[PromiseValue]]: undefined}

Uncaught (in promise) TypeError: Illegal invocation

我想了解的是为什么第一种情况的输出与第二种情况的输出不同,以及为什么会抛出错误。我想我调用 promise 就好了。谢谢!

这个Illegal invocation其实和promise一点关系都没有。在浏览器中,.log() 在传递时必须绑定到 console,所以你需要这样的东西:

parsePromised('{"1": 1, "2": 2, "3": {"4": 4, "5": {"6": 6}}}')
  .then(console.log<strong>.bind(console)</strong>);

另外一个问题,我无法重现,只能看到多出一行。参见 https://jsfiddle.net/sbonrcxm/