如何正确提交蓝鸟的JSON.parse方法

我试图promisify JSON.parse方法,但不幸的是没有任何运气。 这是我的尝试:

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

但我得到以下错误

 Unhandled rejection Error: object 

Promise.promisify被认为是具有callback函数的asynchronous函数。 JSON.parse不是这样的函数,所以你不能在这里使用promisify

如果你想从一个可能同步throw的函数中创build一个promise- Promise.method函数, Promise.method就是要走的路:

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

另外,你只需要使用Promise.resolve来启动你的链:

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

首先, JSON.parse不是一个asynchronous函数。 所以,不要试图强制它。


因为我想创build一个JSON.parse位于顶部的承诺链

然后,简单地创build一个用parsing的JSON对象解决的Promise,就像这样

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

现在,对于你的实际问题,你正在得到错误,

 Unhandled rejection Error: object 

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

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

阅读本文 Bergi在评论中指出,我在这里展示的方法存在一个问题。 如果JSON.parse调用失败,那么错误将被同步引发,你可能不得不写入try...catchPromise代码中。 相反,可以把它写成Bergi在他的回答中提出的build议,只用数据创build一个Promise对象,然后在Promise链上做JSON.parse

晚了,但我可以完全理解为什么你可能想要一个从不抛出exception的promisified JSONparsing方法。 如果没有别的,那么从代码中删除样板尝试/捕获处理。 另外,我没有看到同步行为不应该包含在承诺中的理由。 所以在这里:

 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)