我开始了一个简单的Angular2 Electron应用程序,并且我有一个查询本地SQL Server数据库的服务方法。到目前为止一切正常。现在我正尝试将服务数据库调用的结果获取到我的组件并以某种方式显示它。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;
}
}
我得到的结果回来,但因为它回来返回结果之前该组件永远看不到它。
我试着在查询呼叫做一个的await,在连接池功能中,但我得到一个错误,说明等待着只能异步函数中调用,即使我已经异步对方法设置。 mssql包有一个Async/ Await section,但是当我尝试它时,该页面上的给定语法给出了错误。
任何想法如何我可以写这个使用承诺?
我认为我的问题是试图做到“老”的方式,返回一个promise.defer(),然后设置拒绝并解决。这种新的方式将整个承诺定义包装在异步代码的周围。 +1为额外的解释和清晰度。 – Ben