Watch.JS icon indicating copy to clipboard operation
Watch.JS copied to clipboard

Infinite loop on pushing to array

Open gdude2002 opened this issue 11 years ago • 7 comments

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 avatar Mar 05 '14 13:03 gdude2002

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

gdude2002 avatar Mar 05 '14 14:03 gdude2002

Bump... Having the same exact issue

rcleozier avatar Sep 15 '14 18:09 rcleozier

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

seawolff avatar Oct 28 '14 19:10 seawolff

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

gdude2002 avatar Oct 28 '14 19:10 gdude2002

@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.

seawolff avatar Oct 29 '14 00:10 seawolff

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

melanke avatar Oct 31 '14 22:10 melanke

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

seawolff avatar Nov 13 '14 01:11 seawolff