melanke / Watch.JS

watch the changes of any object or attribute
Other
2.14k stars 219 forks source link

Infinite loop on pushing to array #67

Open gdude2002 opened 10 years ago

gdude2002 commented 10 years ago

I'm using Node.JS version 0.10.26 with Watch.JS stored locally instead of using NPM (as the NPM version doesn't work).

When I push to an array within an object, Watch.JS seems to get stuck in an infinite loop.

var watchjs = require("./app/utils/watch"), // watchjs.watch(obj, function (prop, action, difference, oldvalue), <int> levels, true);
    obj = {"objectpacks": {"model_ids": ["ABCD"]}};

function watch(prop, action, difference, oldvalue) {
    watchjs.noMore = true;

    console.log("WATCH | Prop:", prop);
    console.log("WATCH | Action:", action);
    console.log("WATCH | Difference:", difference);
    console.log("WATCH | Oldvalue:", oldvalue);
}

watchjs.watch(obj, watch, 10, true);

function test() {
    console.log("Pushing.");
    obj.objectpacks.model_ids.push("test");
}

setTimeout(test, 2000);

Results in the following output..

Pushing.
WATCH | Prop: model_ids
WATCH | Action: push
WATCH | Difference: { '0': 'test' }
WATCH | Oldvalue: undefined
WATCH | Prop: objectpacks
WATCH | Action: differentattr
WATCH | Difference: { added: [ 'ABCD,test' ], removed: [] }
WATCH | Oldvalue: { model_ids: [ [Getter/Setter], 'test' ] }
WATCH | Prop: objectpacks
WATCH | Action: differentattr
WATCH | Difference: { added: [ 'ABCD,test' ], removed: [ 'ABCD,test' ] }
WATCH | Oldvalue: { model_ids: [ [Getter/Setter], 'test' ],
  'ABCD,test': undefined }
WATCH | Prop: objectpacks
WATCH | Action: differentattr
WATCH | Difference: { added: [ 'ABCD,test' ], removed: [ 'ABCD,test' ] }
WATCH | Oldvalue: { model_ids: [ [Getter/Setter], 'test' ],
  'ABCD,test': undefined }
WATCH | Prop: objectpacks
WATCH | Action: differentattr
WATCH | Difference: { added: [ 'ABCD,test' ], removed: [ 'ABCD,test' ] }
WATCH | Oldvalue: { model_ids: [ [Getter/Setter], 'test' ],
  'ABCD,test': undefined }

This loops until it's killed. Any ideas?

gdude2002 commented 10 years ago

Removing the 10 from the function here does solve the problem, but why?

rcleozier commented 10 years ago

Bump... Having the same exact issue

seawolff commented 9 years ago

Same issue here, even unwatching after first iteration causes a complete crash. In Chrome 38 in case it's useful.

gdude2002 commented 9 years ago

I'm not hopeful that the dev will respond here, but please remember to post your code, @rcleozier and @seawolff

seawolff commented 9 years ago

@gdude2002 Here is my code. It's abbreviated and in CoffeeScript though:

class Validation
  errors: []
  constructor: (data) ->
    # More code ...
    @errors.push {code: data.errors.error.code, message: data.errors.error.message}

class Billing_Form
  constructor: () ->
    # data = data returned from ajax
    validation = new Validation(data)
    watch validation, "errors", callback = ->
      console.log validation.errors
      unwatch validation, "errors", callback #even with unwatch it will loop forever
      return 

However to reproduce simply watch a bound array on an object and push data into it.

melanke commented 9 years ago

Sorry guys, anything I can help you with? I am not currently working on Watch. Sorry about that, but any pull request will be appreciated

seawolff commented 9 years ago

@melanke yeah, same. I'll get a PR open ASAP