访问 NeDB find() 结果

Accessing NeDB find() results

我正在使用 Angular 2 和 Electron 制作一个应用程序,并使用 NeDB 作为数据存储。

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

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

}

在我的组件中,我使用一种方法在使用 ngOnInit 挂钩初始化组件时调用服务的 getData() 方法。

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

在修补搜索服务时,我发现 docs 我在 find() 方法中无法从方法外部访问,而且 result = docs 似乎什么也没做。所以我在想我需要一些异步魔法来完成这项工作。我想用 Observables 做到这一点,但什么也做不了,可能是做错了。

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

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

如果你想使用 Observables,你可以这样做:

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