Skip to content
This repository has been archived by the owner on Mar 22, 2022. It is now read-only.

Infinite loop on pushing to array #67

Open
gdude2002 opened this issue Mar 5, 2014 · 7 comments
Open

Infinite loop on pushing to array #67

gdude2002 opened this issue Mar 5, 2014 · 7 comments

Comments

@gdude2002
Copy link

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
Copy link
Author

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

@rcleozier
Copy link

Bump... Having the same exact issue

@seawolff
Copy link

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

@gdude2002
Copy link
Author

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

@seawolff
Copy link

@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
Copy link
Owner

melanke commented Oct 31, 2014

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
Copy link

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

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants