如何从查询创建Observable?

时间:2016-11-29 11:23:30

标签: angular rxjs electron observable nosql

如何从电子异步LinvoDB数据库查询中获取角度2中的rxjs-observable?

在主要过程中:

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来访问函数:

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

除此之外,我尝试了各种其他方法,例如将observable声明为变量并合并db的结果,将查询设置为live(),通过ipc获取数据。 我做错了什么?

2 个答案:

答案 0 :(得分: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));
}

答案 1 :(得分:0)

您可以将整个load函数包装为返回Observable:

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

希望这适合你!