【问题标题】:How to promisify correctly JSON.parse method with bluebird如何使用 bluebird 正确地承诺 JSON.parse 方法
【发布时间】:2015-11-25 09:05:07
【问题描述】:

我正在尝试承诺JSON.parse 方法,但不幸的是没有任何运气。这是我的尝试:

Promise.promisify(JSON.parse, JSON)(data).then((result: any) => {...

但我收到以下错误

Unhandled rejection Error: object

【问题讨论】:

  • JSON.parse 是一个同步功能。为什么要承诺呢?
  • 因为我想创建一个承诺链,其中 JSON.parse 位于顶部
  • @Mazzy:你的data来自哪里?你能告诉我们你的完整代码吗?可能有更好的解决方案。
  • @Mazzy 请将接受的答案更改为 bergi's。像这样留下不正确的答案是stackoverflow如何成为错误信息的来源而不是有用的。

标签: javascript node.js asynchronous promise bluebird


【解决方案1】:

首先,JSON.parse 不是异步函数。所以,不要试图承诺它。


因为我想创建一个承诺链,其中 JSON.parse 位于顶部

然后,只需创建一个使用解析后的 JSON 对象解析的 Promise,如下所示

Promise.resolve(JSON.parse(data))
    .then(...)

现在,对于您的实际问题,您遇到了错误,

Unhandled rejection Error: object

因为,如果您的承诺链被拒绝,您就没有处理它。所以,不要忘记附加一个 catch 处理程序,像这样

Promise.resolve(JSON.parse(data))
    .then(...)
    .catch(...)

阅读本文 正如 Bergi 在 cmets 中所指出的,我在此处展示的方法存在问题。如果JSON.parse 调用失败,则错误将同步抛出,您可能需要在Promise 代码周围编写try...catch。相反,可以按照 Bergi 在 his answer 中的建议编写它,以仅使用数据创建一个 Promise 对象,然后在该 Promise 链上执行 JSON.parse

【讨论】:

  • -1 表示未从JSON.parse() 调用中捕获异常。
  • @Bergi 想想看,我的回答完全没用。感谢您指出。
【解决方案2】:

Promise.promisify 被认为是带有回调函数的异步函数。 JSON.parse没有这个功能,所以这里不能使用promisify

如果你想从一个可能同步throw 的函数创建一个返回承诺的函数,Promise.method 是要走的路:

var parseAsync = Promise.method(JSON.parse);
…

parseAsync(data).then(…);

或者,您只想使用Promise.resolve 来启动您的链:

Promise.resolve(data).then(JSON.parse).then(…);

【讨论】:

  • Promise.resolve(...) 对我来说就像一个魅力。谢谢!
【解决方案3】:

聚会迟到了,但我完全可以理解为什么您可能想要一个从不抛出异常的承诺 JSON 解析方法。如果没有别的,那么从您的代码中删除样板try/catch-handling。此外,我认为没有理由不将同步行为包含在 Promise 中。所以在这里:

function promisedParseJSON(json) {
    return new Promise((resolve, reject) => {
        try {
            resolve(JSON.parse(json))
        } catch (e) {
            reject(e)
        }
    })
}

用法,例如:

fetch('/my-json-doc-as-string')
  .then(promisedParseJSON)
  .then(carryOn)
  .catch(dealWithIt)

【讨论】:

  • JSON.parse 会为语法错误的输入抛出异常:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… 请编辑您的答案以删除不正确的信息
  • 是的,当然可以。这就是 try/catch 存在的原因。这就是为什么它是通过拒绝承诺来处理的,因此解析 JSON 的 承诺包装版本不会抛出同步异常,而是拒绝承诺,就像在承诺领域中应该的那样。跨度>
  • 对不起。我想念你的第一句话。再读一遍,我发现你的答案很好。道歉。
猜你喜欢
  • 2017-03-25
  • 2016-07-27
  • 1970-01-01
  • 2014-09-07
  • 2016-04-10
  • 2018-02-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-15
相关资源
最近更新 更多