mobxjs / serializr

Serialize and deserialize complex object graphs to and from JSON and Javascript classes
MIT License
766 stars 52 forks source link

Make "deserialize" promisifiable #77

Open razetdinov opened 6 years ago

razetdinov commented 6 years ago

deserialize uses node-style callbacks, but fails to follow the rule "callback is the last argument". This prevents making use of util.promisify, which

Takes a function following the common error-first callback style, i.e. taking a(err, value) => ... callback as the last argument, and returns a version that returns promises.

I suggest moving callback to the end of argument list. This would also be more convenient: now you have to pass null for the callback in cases when you don't need async deserialization, but have to pass custom args.

alexggordon commented 6 years ago

You are correct, this is a change that needs to be made. Unfortunately, this would be a breaking change which would be tough to implement in version 1x of serializer.

I'm thinking version 2 should return a promise on serialization/deserialization instead of a callback. Thoughts?

waliarubal commented 5 years ago

Hello @razetdinov and @alexggordon, I have created below code for my typescript project and using it successfully without any issues. Its a generic await-able method.

static async Deserialize<T>(modelSchema: ClazzOrModelSchema<T>, json: any): Promise<T> { return new Promise<T>((resolve, reject) => { deserialize<T>(modelSchema, json, (error: any, result: T) => { if (error) reject(error); else resolve(result); }); }); }