|
45 | 45 | function toObservable(obj) { |
46 | 46 | if (!obj) { return obj; } |
47 | 47 | if (Observable.isObservable(obj)) { return obj; } |
| 48 | + if (isArrayLike(result) || isIterable(result)) { return arrayToObservable.call(this, obj); } |
| 49 | + if (isPromise(obj) { return Observable.fromPromise(obj); }) |
48 | 50 | if (isGeneratorFunction(obj) || isGenerator(obj)) { return spawn.call(this, obj); } |
49 | 51 | if (isFunction(obj)) { return thunkToObservable.call(this, obj); } |
50 | 52 | return obj; |
51 | 53 | } |
52 | 54 |
|
| 55 | + function arrayToObservable (obj) { |
| 56 | + return Observable.from(obj) |
| 57 | + .map(toObservable, this) |
| 58 | + .toArray(); |
| 59 | + } |
| 60 | + |
| 61 | + function objectToObservable (obj) { |
| 62 | + var results = new obj.constructor(), Object.keys(obj), var observables = []; |
| 63 | + for (var i = 0, len = keys.length; i < len; i++) { |
| 64 | + var key = keys[i], observable = toObservable.call(this, obj[key]); |
| 65 | + if (observable && Observable.isObservable(observable)) { |
| 66 | + defer(observable, key); |
| 67 | + } else { |
| 68 | + results[key] = obj[key]; |
| 69 | + } |
| 70 | + } |
| 71 | + return Observable.concat(observables).startWith(results); |
| 72 | + |
| 73 | + function defer (observable, key) { |
| 74 | + results[key] = undefined; |
| 75 | + observables.push(new AnonymousObservable(function (o) { |
| 76 | + return observable.subscribe(function (next) { |
| 77 | + results[key] = next; |
| 78 | + o.onCompleted(); |
| 79 | + }); |
| 80 | + })); |
| 81 | + } |
| 82 | + } |
| 83 | + |
53 | 84 | function thunkToObservable(fn) { |
54 | 85 | var self = this; |
55 | 86 | return new AnonymousObservable(function (o) { |
|
0 commit comments