2

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

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

搜索服务.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.

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

4

1 回答 1

5

find方法是异步的,回调函数不会立即执行,您可以使用如下的 Promise:

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

您可以在此处了解有关 Promise的更多信息

如果你想使用 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)
    )
}
于 2017-07-07T09:23:48.597 回答