我尝试使用最新的TypeScript增强功能对我的一些代码进行现代化改造。 我们有很多记忆模式。 我们的想法是,某些服务有多个订阅者,我们希望确保每个人都在等待一个电话,而且不会拨打多个电话。 代码看起来像那样
if (this.MyQueryStatus.Equals(QueryStatus.Succeeded))
{
#region IF Succeeded
#region Create Results DataTable
DataTable resultsTable = new DataTable("Results");
resultsTable.Columns.Add("Id");
resultsTable.Columns.Add("FullName");
resultsTable.Columns.Add("Foreground");
resultsTable.Columns.Add("Blink");
resultsTable.Columns.Add("Background");
resultsTable.Columns.Add("TypeDesc");
resultsTable.Columns.Add("MemoryUsage");
#endregion Create Results DataTable
foreach (var row in this.MyQueryResult.Rows)
{
#region ForEach Row
DataRow newRow = resultsTable.NewRow();
newRow["Id"] = row.Data[0].ToString();
newRow["FullName"] = row.Data[1].ToString();
newRow["Foreground"] = row.Data[2].ToString();
newRow["Blink"] = row.Data[3].ToString();
newRow["Background"] = row.Data[4].ToString();
newRow["TypeDesc"] = row.Data[5].ToString();
newRow["MemoryUsage"] = row.Data[6].ToString();
resultsTable.Rows.Add(newRow);
#endregion ForEach Row
}
dataGridViewResults.DataSource = resultsTable;
tabControlMain.SelectedTab = tabControlMain.TabPages["tabPageResults"];
#endregion IF Succeeded
}
我的问题是:像这样的东西会产生与await运算符相同的效果吗?我不能访问promise对象"吗
private isAdmin: Promise<Boolean>;
public IsCurrentUserAdmin(): Promise<Boolean> {
if (!this.isAdmin) {
this.isAdmin = httpService.goGetTheData().then((data) => //do something and return Boolean);
}
return this.isAdmin;
答案 0 :(得分:2)
不,您绝对需要访问memo化的promise对象。 async
/ await
并不一定能阻止它 - 它只是then
来电的语法糖 - 但在您的特定情况下,它并没有真正帮助。由于您没有缓存goGetTheData()
承诺,而是由.then(…)
返回的承诺(因此&#34;做某事&#34;只执行一次),您需要为此写一个额外的辅助方法:
private isAdmin: Promise<boolean>;
private async fetchIsAdmin(): Promise<boolean> {
const data = await httpService.goGetTheData();
// do something and
return // a boolean
}
public IsCurrentUserAdmin(): Promise<boolean> {
if (!this.isAdmin) {
this.isAdmin = this.fetchIsAdmin();
// you could `await this.isAdmin` in here as well, but that would happen for every call
return this.isAdmin;
}