2017-07-07 58 views
0

我正在用Angular 2和Electron制作应用程序,并将NeDB用作数据存储。访问NeDB查找()结果

搜索服务旨在处理数据库操作,现在我希望它加载整个数据库并将其返回。

search.service.ts

import { Injectable } from '@angular/core'; 

import * as Datastore from 'nedb'; 
import * as path from 'path'; 

@Injectable() 
export class SearchService { 

    constructor() { } 
    getData(){ 
    var db = new Datastore({ 
     filename: path.resolve('src/assets/db.json'), 
     autoload: true, 
    }); 
    var result; 
    db.find({}, function(err, docs) { 
     result = docs; 
    }); 
    console.log(result); 
    return result; 
    } 

} 

以我分量I使用一种方法在与ngOnInit钩组件的初始化来调用服务的getData()方法。

但是当我登录结果时,我得到undefined

虽然修补与搜索服务,我发现docs我有find()方法不能从外部访问的方法,它看起来像result = docs什么都不做。所以我在想,我需要一些异步魔法来完成这项工作。我想用Observables来做到这一点,但无法做到,可能是做错了。

回答

1

find方法是异步的,不立即执行的回调函数,你可以使用的承诺象下面这样:

getData() { 
    var db = new Datastore({ 
     filename: path.resolve('src/assets/db.json'), 
     autoload: true, 
    }); 
    return new Promise((resolve, reject) => { 
     db.find({}, function(err, docs) { 
      if(err) reject(err); 
      resolve(docs); 
     }); 
    }) 
} 

someOtherFunc() { 
    this.getData() 
    .then((docs) => console.log(docs)) // here you will get it 
    .catch((err) => console.error(err)); 
} 

您可以了解更多有关承诺here

如果你想使用观测量,你可以这样做:

getData() { 
    return new Rx.Observable(subscriber => { 
     var db = new Datastore({ 
      filename: path.resolve('src/assets/db.json'), 
      autoload: true, 
     }); 
     db.find({}, function(err, docs) { 
      if (err) subscriber.error(err); 
      subscriber.next(docs); 
     }); 
    }) 

} 

someOtherFunc() { 
    this.getData().subscribe(
     data => console.log("success", data), 
     err => console.error("error", err) 
    ) 
} 
+0

非常感谢你的清晰和快速的答案!但是我想知道,由于它们的一致性,我是否可以使用可观测量而不是承诺。我想用这个服务在db中进行搜索并提供不同的信息,这样我就会收集到许多信息,这些信息会带来承诺而不是观测值。 –

+0

@IvanBespalov我编辑了我的答案,包括可观察的方法 – Dhyey