I just got the following error in 0.22 (OSX) - was working ok in 0.21:
// ignore case so just convert both to lowercase before comparison
function stringContainsString(main, filter){
if (filter.length <= 3)
return false;
return main.toLowerCase().indexOf(filter.toLowerCase()) != -1;
}
var filteredItems = allItems.where(function(e){
return Observable(function() {
return stringContainsString(e.suburb, searchString.value);
});
});
LOG: InternalError: UnhandledException: Name: RangeError: Maximum call stack size exceeded
Error message: Uncaught RangeError: Maximum call stack size exceeded
File name: FuseJS/Observable.js
Line number: 178
Source line: var i = current._dependencies.indexOf(this);
JS stack trace: RangeError: Maximum call stack size exceeded
at Observable.depend (FuseJS/Observable.js:178:32)
at Object.defineProperty.get (FuseJS/Observable.js:513:8)
at null._func (MainView.js:100:61)
at evaluate (FuseJS/Observable.js:127:22)
at depChanged (FuseJS/Observable.js:113:16)
at FuseJS/Observable.js:571:6
at PumpMessages (FuseJS/Observable.js:562:3)
at Observable._queueMessage (FuseJS/Observable.js:584:2)
at Object.defineProperty.set (FuseJS/Observable.js:520:8)
at depChanged (FuseJS/Observable.js:113:14)
in Outracks.Simulator.GeneratedApplication</usr/local/share/uno/Packages/FuseCore/0.32.11/$.uno:307>
ERROR:
Name: RangeError: Maximum call stack size exceeded
Error message: Uncaught RangeError: Maximum call stack size exceeded
File name: FuseJS/Observable.js
Line number: 178
Source line: var i = current._dependencies.indexOf(this);
JS stack trace: RangeError: Maximum call stack size exceeded
at Observable.depend (FuseJS/Observable.js:178:32)
at Object.defineProperty.get (FuseJS/Observable.js:513:8)
at null._func (MainView.js:100:61)
at evaluate (FuseJS/Observable.js:127:22)
at depChanged (FuseJS/Observable.js:113:16)
at FuseJS/Observable.js:571:6
at PumpMessages (FuseJS/Observable.js:562:3)
at Observable._queueMessage (FuseJS/Observable.js:584:2)
at Object.defineProperty.set (FuseJS/Observable.js:520:8)
at depChanged (FuseJS/Observable.js:113:14)
Just updated post, but essentially it’s this code:
// ignore case so just convert both to lowercase before comparison
function stringContainsString(main, filter){
if (filter.length <= 3)
return false;
return main.toLowerCase().indexOf(filter.toLowerCase()) != -1;
}
var filteredItems = allItems.where(function(e){
return Observable(function() {
return stringContainsString(e.suburb, searchString.value);
});
});
LOG: InternalError: Script error: Name: RangeError: Maximum call stack size exceeded
Error message: Uncaught RangeError: Maximum call stack size exceeded
File name: FuseJS/Observable.js
Line number: 134
Source line: oldDependencies.forEach(function(x) {
JS stack trace: RangeError: Maximum call stack size exceeded
at FuseJS/Observable.js:134:35
at Array.forEach (native)
at evaluate (FuseJS/Observable.js:134:19)
at depChanged (FuseJS/Observable.js:113:16)
at FuseJS/Observable.js:571:6
at PumpMessages (FuseJS/Observable.js:562:3)
at Observable._queueMessage (FuseJS/Observable.js:584:2)
at Object.defineProperty.set (FuseJS/Observable.js:520:8)
at depChanged (FuseJS/Observable.js:113:14)
at FuseJS/Observable.js:571:6
</usr/local/share/uno/Packages/Fuse.Scripting.V8/0.32.14/$.uno:135>
LOG: InternalError: UnhandledException: Name: RangeError: Maximum call stack size exceeded
Error message: Uncaught RangeError: Maximum call stack size exceeded
File name: FuseJS/Observable.js
Line number: 134
Source line: oldDependencies.forEach(function(x) {
JS stack trace: RangeError: Maximum call stack size exceeded
at FuseJS/Observable.js:134:35
at Array.forEach (native)
at evaluate (FuseJS/Observable.js:134:19)
at depChanged (FuseJS/Observable.js:113:16)
at FuseJS/Observable.js:571:6
at PumpMessages (FuseJS/Observable.js:562:3)
at Observable._queueMessage (FuseJS/Observable.js:584:2)
at Object.defineProperty.set (FuseJS/Observable.js:520:8)
at depChanged (FuseJS/Observable.js:113:14)
at FuseJS/Observable.js:571:6
in Outracks.Simulator.GeneratedApplication</usr/local/share/uno/Packages/FuseCore/0.32.14/$.uno:307>
LOG: InternalError: Script error: Name: RangeError: Maximum call stack size exceeded
Error message: Uncaught RangeError: Maximum call stack size exceeded
File name: FuseJS/Observable.js
Line number: 511
Source line: get : function()
JS stack trace: RangeError: Maximum call stack size exceeded
at Object.defineProperty.get (FuseJS/Observable.js:511:16)
at null._func (MainView.js:99:34)
at evaluate (FuseJS/Observable.js:127:22)
at depChanged (FuseJS/Observable.js:113:16)
at FuseJS/Observable.js:571:6
at PumpMessages (FuseJS/Observable.js:562:3)
at Observable._queueMessage (FuseJS/Observable.js:584:2)
at Object.defineProperty.set (FuseJS/Observable.js:520:8)
at depChanged (FuseJS/Observable.js:113:14)
at FuseJS/Observable.js:571:6
</usr/local/share/uno/Packages/Fuse.Scripting.V8/0.32.14/$.uno:135>
LOG: InternalError: UnhandledException: Name: RangeError: Maximum call stack size exceeded
Error message: Uncaught RangeError: Maximum call stack size exceeded
File name: FuseJS/Observable.js
Line number: 511
Source line: get : function()
JS stack trace: RangeError: Maximum call stack size exceeded
at Object.defineProperty.get (FuseJS/Observable.js:511:16)
at null._func (MainView.js:99:34)
at evaluate (FuseJS/Observable.js:127:22)
at depChanged (FuseJS/Observable.js:113:16)
at FuseJS/Observable.js:571:6
at PumpMessages (FuseJS/Observable.js:562:3)
at Observable._queueMessage (FuseJS/Observable.js:584:2)
at Object.defineProperty.set (FuseJS/Observable.js:520:8)
at depChanged (FuseJS/Observable.js:113:14)
at FuseJS/Observable.js:571:6
in Outracks.Simulator.GeneratedApplication</usr/local/share/uno/Packages/FuseCore/0.32.14/$.uno:307>
LOG: Name: RangeError: Maximum call stack size exceeded
Error message: Uncaught RangeError: Maximum call stack size exceeded
File name: FuseJS/Observable.js
Line number: 511
Source line: get : function()
JS stack trace: RangeError: Maximum call stack size exceeded
at Object.defineProperty.get (FuseJS/Observable.js:511:16)
at null._func (MainView.js:99:34)
at evaluate (FuseJS/Observable.js:127:22)
at depChanged (FuseJS/Observable.js:113:16)
at FuseJS/Observable.js:571:6
at PumpMessages (FuseJS/Observable.js:562:3)
at Observable._queueMessage (FuseJS/Observable.js:584:2)
at Object.defineProperty.set (FuseJS/Observable.js:520:8)
at depChanged (FuseJS/Observable.js:113:14)
at FuseJS/Observable.js:571:6
LOG: Failure state within a failed state. Simply ignoring that.
ERROR:
Name: RangeError: Maximum call stack size exceeded
Error message: Uncaught RangeError: Maximum call stack size exceeded
File name: FuseJS/Observable.js
Line number: 134
Source line: oldDependencies.forEach(function(x) {
JS stack trace: RangeError: Maximum call stack size exceeded
at FuseJS/Observable.js:134:35
at Array.forEach (native)
at evaluate (FuseJS/Observable.js:134:19)
at depChanged (FuseJS/Observable.js:113:16)
at FuseJS/Observable.js:571:6
at PumpMessages (FuseJS/Observable.js:562:3)
at Observable._queueMessage (FuseJS/Observable.js:584:2)
at Object.defineProperty.set (FuseJS/Observable.js:520:8)
at depChanged (FuseJS/Observable.js:113:14)
at FuseJS/Observable.js:571:6
When you have very large observables like here, .where() with an observable function as the condition becomes a very expensive operation, as it creates a lot of new observables per item in your array, each of which needs a subscription.
Instead of where() with an observable condition, use map(condition) to a where(), like this:
Hey Anders this is really interesting could you elaborate on the two differences between the two pieces of code. What’s happening in each, and why one is slower, I’m still a bit confused.