Starcounter-Jack / JSON-Patch

Lean and mean Javascript implementation of the JSON-Patch standard (RFC 6902). Update JSON documents using delta patches.
MIT License
1.78k stars 215 forks source link

Optional observe callback not called #298

Open hamptonsmith opened 2 years ago

hamptonsmith commented 2 years ago

Hey folks! Thanks for an awesome library.

Am I misreading the observe() documentation regarding the optional callback? Documentation says "When changes are detected, the optional callback is called", but I'm not seeing that behavior:

Welcome to Node.js v16.14.2.
Type ".help" for more information.
> var fastJsonPatch = require('fast-json-patch')
undefined
> var doc = {};
undefined
> fastJsonPatch.observe(doc, function(p) { console.log(p); })
{ /* snip */ }
> doc.foo = 'bar';
'bar'
>

I'm expecting to see the patch array console.log()'d via the callback, but the callback is never called.

Calling generate() flushes the changes and I then see them printed via the callback.

Ghirigoro commented 1 year ago

I can confirm that the callback is not called:

import * as JSONPatch from "fast-json-patch";

const obj = {
  foo: "bar",
  baz: "qux",
  quux: 1,
};

let numCalls = 0;
const o = JSONPatch.observe(obj, (patches) => {
  numCalls++;
});

obj.foo = "baz";
obj.baz = "quux";
obj.quux = 2;
console.log(numCalls); // <- expected 0 got 0
// The observe callback is driven by a 0 duration timeout so we have to wait for another run through the event loop...
setTimeout(()=>{
  console.log(numCalls); // <- expected 1 got 0  
  JSONPatch.generate(o);
  console.log(numCalls); // <- expected 1 got 1
}, 100);