How to promisify correctly JSON.parse method with bluebird

偶尔善良 提交于 2019-12-04 19:48:51

问题


I'm trying to promisify JSON.parse method but unfortunately without any luck. This is my attempt:

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

but I get the following error

Unhandled rejection Error: object

回答1:


Promise.promisify is thought for asynchronous functions that take a callback function. JSON.parse is no such function, so you cannot use promisify here.

If you want to create a promise-returning function from a function that might throw synchronously, Promise.method is the way to go:

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

parseAsync(data).then(…);

Alternatively, you will just want to use Promise.resolve to start your chain:

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



回答2:


First of all, JSON.parse is not an asynchronous function. So, don't try to promisify it.


Because I want to create a chain of promises where JSON.parse stand at the top

Then, simply create a Promise resolved with the parsed JSON object, like this

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

Now, to your actual question, you are getting the error,

Unhandled rejection Error: object

because, if your chain of promises is rejected, you are not handling it. So, don't forget to attach a catch handler, like this

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

READ THIS There is a problem with the approach I have shown here, as pointed out by Bergi, in the comments. If the JSON.parse call fails, then the error will be thrown synchronously and you may have to write try...catch around the Promise code. Instead, one would write it as Bergi suggested in his answer, to create a Promise object with just the data, and then do JSON.parse on that Promise chain.




回答3:


Late to the party, but I can totally understand why you might want a promisified JSON parse method which never throws exceptions. If for nothing else, then to remove boilerplate try/catch-handling from your code. Also, I see no reason why synchronous behavior shouldn't be wrapped in promises. So here:

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

Usage, e.g:

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


来源:https://stackoverflow.com/questions/32309392/how-to-promisify-correctly-json-parse-method-with-bluebird

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!