私は簡単なAngular2 Electronアプリケーションを開始しました。ローカルSQL Serverデータベースを照会するサービスメソッドがあります。これまではすべてうまく動作します。今私は、私のコンポーネントにサービスDB呼び出しの結果を取得し、何とかそれを表示しようとしています。コールバックからAsyncへのAngular2変更サービスメソッド
問題は、クエリロジックは、よりコールバック構文のために書かれていることである。
sql.query(sqlString, (err, result) => {
...
callback(result);
...
});
結果は常にの結果パラメータの範囲内となりますので、私は、それは約束を返すように書き換え苦労していますクエリコマンド機能。私のコンポーネントは、次のようになります。
export class LinkDocRetriever {
constructor(private myService: MyService) { }
results = "";
loadMyData(id: number): void {
let tcData = this.myService.getMyData();
tcData.forEach(element => {
this.results += element.FileName + " " + "....\n";
});
};
}
そして、私のサービスは、次のようになります。
import { Injectable } from "@angular/core";
import * as sql from "mssql";
@Injectable()
export class MyService {
getMyData():Array<MyItem> {
let myData:Array<MyItem> = [];
let config = {
user: "sa",
password: "xxx",
server: "localhost",
database: "mydb"
};
const pool1 = new sql.ConnectionPool(config, err => {
if (err) {
console.log("connect erro: " + err);
}
let q:string = `SELECT TOP 10 * FROM MyTable;`;
let final = pool1.request()
.query<MyItem>(q, (err, result) => {
if (err) {
console.log("request err: " + err);
}
console.log("db result count: " + result.recordsets[0].length);
result.recordsets[0].forEach(row => {
myData.push(row);
});
});
});
return myData;
}
}
私は戻って結果を得るかが、結果が返される前に、それが戻ってくるので、コンポーネントがそれを見たことがありません。
私は、ConnectionPool関数内のクエリ呼び出しでawaitを実行しようとしましたが、そのメソッドに非同期が設定されていても、非同期関数内でのみawaitを呼び出すことができるというエラーが発生します。 mssqlパッケージにはAsync/ Await sectionがありますが、私が試してみると、そのページの指定された構文にエラーがあります。
私はこれを約束して書くことができますか?
私は自分の問題がpromise.defer()を返して、それを "古い"方法でしようとしていたと思って、拒否と解決を設定します。この新しい方法は、約束の定義全体を非同期コードに置き換えます。余分な説明と明快さのため+1。 – Ben