2016-11-29 3 views
0

Wie kann ich eine rxjs-Observable in Winkel 2 von einer asynchronen LinvoDB Datenbankabfrage in Elektron bekommen?Wie erstelle ich eine Observable von der Abfrage?

im Hauptprozess:

exports.load = function(parameters){ 
    var l = parseInt(parameters.l); 
    var t = parseInt(parameters.t); 
    var r = parseInt(parameters.r); 
    var b = parseInt(parameters.b); 
    return cmelement.find({ 
      $or: [ 
       {$and: [{x0: { $gt: l, $lt: r }}, {y0: { $gt: t, $lt: b }}]}, 
       {$and: [{x1: { $gt: l, $lt: r }}, {y1: { $gt: t, $lt: b }}]} 
      ] 
     }).filter(function(x){ return x !== undefined }) 
     .exec(function (err, doc) { 
      console.log(doc); // outputs the correct data 
      return doc; 
     }); 
}; 

in den Renderer-Prozess I electron.remote verwenden, um die Funktion aufzurufen:

getElements(parameters) { 
    Observable.of(elementController.load(parameters)) 
       .subscribe((x) => console.log(x)); // outputs 'undefined' 
    } 

Außerdem habe ich versucht, eine Vielzahl anderer Methoden wie die beobachtbare erklärt als eine Variable und Zusammenführen der Ergebnisse von db, setzen Sie die Abfrage als live(), erhalten Sie die Daten über ipc. Was mache ich falsch?

Antwort

0

Sie können Ihre gesamte Ladefunktion in der Rückkehr eines beobachtbaren wickeln:

exports.load = function(parameters){ 
    return Observable.create(observer => { 
    var l = parseInt(parameters.l); 
    var t = parseInt(parameters.t); 
    var r = parseInt(parameters.r); 
    var b = parseInt(parameters.b); 
    return cmelement.find({ 
      $or: [ 
       {$and: [{x0: { $gt: l, $lt: r }}, {y0: { $gt: t, $lt: b }}]}, 
       {$and: [{x1: { $gt: l, $lt: r }}, {y1: { $gt: t, $lt: b }}]} 
      ] 
     }).filter(function(x){ return x !== undefined }) 
     .exec(function (err, doc) { 
      console.log(doc); // outputs the correct data 
      observer.next(doc); 
      observer.complete(); 
     }); 
    }); 
}; 

Dann in Ihrer GetElements Funktion:

getElements(parameters) { 
    elementController.load(parameters) 
     .subscribe((x) => console.log(x)); 
    } 

Hoffe, das funktioniert für Sie!

+0

Vielen Dank, funktionierte perfekt mit Ihrem Code. – Patrick

+0

Bitte @Patrick, wenn Sie zufrieden sind, markieren Sie diese Antwort als die richtige! Vielen Dank! – Jorge

0

Ich kann es nicht testen, aber würde wie folgt annehmen:

exports.load = function(parameters, subject){ 
    var l = parseInt(parameters.l); 
    var t = parseInt(parameters.t); 
    var r = parseInt(parameters.r); 
    var b = parseInt(parameters.b); 
    return cmelement.find({ 
      $or: [ 
       {$and: [{x0: { $gt: l, $lt: r }}, {y0: { $gt: t, $lt: b }}]}, 
       {$and: [{x1: { $gt: l, $lt: r }}, {y1: { $gt: t, $lt: b }}]} 
      ] 
     }).filter(function(x){ return x !== undefined }) 
     .exec(function (err, doc) { 
      console.log(doc); // outputs the correct data 

      // fire your subject here .. ! 
      subject && subject.next && subject.next(doc) && subject.complete(); 

      return doc; 
     }); 
}; 

getElements(parameters) { 
    const subj = new Subject<any /* or your type.. */>(); 
    elementController.load(parameters, subj); 

    // return your subject here or subscribe to it.. 
    subj.subscribe(doc => console.log(doc)); 
} 
Verwandte Themen