2017-07-07 2 views
0

私はAngular 2とElectronを使ってアプリケーションを作っており、NeDBをデータストレージとして使っています。NeDB find()の結果へのアクセス

検索サービスは、DBを使用した操作を処理するためのものですが、今はデータベース全体をロードして戻す必要があります。

search.service.ts IはngOnInitフックを持つコンポーネントの初期化時にサービスのgetData()メソッドを呼び出す方法を使用して私のコンポーネントで

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

} 

しかし、結果をログに記録すると、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

関連する問題