2016-11-29 63 views
0

如何从电子中的异步LinvoDB数据库查询获取角2中的rxjs-observable?如何从查询创建一个Observable?

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

除此之外我尝试了多种其他的方法类似于声明可观察:

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; 
     }); 
}; 
在渲染过程中,我使用electron.remote访问功能

的主要工序

作为变量并合并来自db的结果,将查询设置为live(),通过ipc获取数据。 我在做什么错?

回答

0

你可以用你的整个负载函数返回到可观察到的:

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(); 
     }); 
    }); 
}; 

然后在您的getElements功能:

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

希望这适合你!

+0

非常感谢您,您的代码完美工作。 – Patrick

+0

如果您满意,请@Patrick将此答案标记为正确答案!谢谢! – Jorge

0

我不能测试,但会假设是这样的:

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)); 
}