[英]Concurrently awaiting multiple asynchronous calls with independent continuations
[英]awaiting multiple calls using Models
我有一個項目。 我正在研究用戶可以將多個帳戶綁定到他/她的個人資料的地方。 但是,要獲取帳號和帳戶名,有一個端點可以調用。 要獲取每個帳號的帳戶余額,需要調用另一個端點。 現在這是我的問題。 根據設計,我需要在每張卡上放置帳號和帳戶余額,因為帳戶可以不止一個。 所以,我的問題是,我怎樣才能最好地實現這一目標? 撥打電話以獲取帳戶詳細信息,然后選擇每個帳號進行另一個調用,該電話將返回該特定帳號的帳戶余額。
這是我的模型:
public class MyAccount
{
public string linkerId { get; set; }
[JsonProperty("accountDetails")]
public AccountDetails Details { get; set; }
public AcctUserDetails acctUserDetails { get; set; }
public LinkedBy linkedBy { get; set; }
public string requestTimestamp { get; set; }
}
public class Account
{
[JsonProperty("payload")]
public List<MyAccount> Accounts { get; set; }
}
public class AccountDetails
{
string acctBalance;
[JsonProperty("accountNumber")]
public string AccountNumber { get; set; }
[JsonProperty("accountName")]
public string AccountName { get; set; }
public string phoneNumber { get; set; }
public string email { get; set; }
[JsonProperty("accountType")]
public string AccountType { get; set; }
public string Balance
{
get
{
foreach (var accountNumm in AccountNumber)
{
MessagingCenter.Send<object, string>(this, "acctNo", AccountNumber);
}
MessagingCenter.Subscribe(this, "myAcctNo", (object obj, string theBalance) =>
{
Device.BeginInvokeOnMainThread(() =>
{
acctBalance = theBalance;
});
});
var newBall = acctBalance;
return newBall;
}
set { Balance = value; }
}
}
此外,My ViewModel 會調用 API 以獲取所有帳戶。
private async void LoadMyAccounts()
{
IsBusy = true;
HttpClient client = new HttpClient();
var url = Constant.GetLinkedAccountsUrl;
var response = await client.GetAsync(url);
var json = await response.Content.ReadAsStringAsync();
Account userAccounts = JsonConvert.DeserializeObject<Account>(json);
var sorted = userAccounts.Accounts;
//getTrans = userTransactions
var allAccounts = new ObservableCollection<MyAccount>(sorted);
AccountsData = allAccounts;
IsBusy = false;
}
然后我有一個服務 class,它發送和訂閱從 model 發送的帳號。這是我的服務類:
public async void GetBalance()
{
HttpClient client = new HttpClient();
var url = Constant.GetAcctBalanceUrl + acctBalance;
var response = await client.GetAsync(url);
var json = await response.Content.ReadAsStringAsync();
if (response.IsSuccessStatusCode)
{
var pro = JsonConvert.DeserializeObject<AcctModel>(json);
var newBal = pro.Balances;
Constant.MyBalance = newBal;
var acctNo = newBal.accountBalance;
MessagingCenter.Send<object, string>(this, "myAcctNo", acctNo);
}
}
你的 model 里面應該沒有業務邏輯; 模型應該只用於存儲或傳遞數據。 設計您的模型以表示將在應用程序中呈現的數據的確切結構。 當加載需要特定類型數據的應用程序部分時,使用服務方法異步檢索所有數據,然后使用檢索數據創建或更新 model(或模型)的實例。 您需要為您的 UI 實現某種方式來指示它同時加載數據,例如隱藏一些控件並將它們替換為微調器。
理想情況下,如果你有適當的關注點分離,你的代碼可能看起來像這樣:
// Model
public class AccountDetails
{
public string AccountNumber { get; set; }
public string AccountName { get; set; }
public string Balance { get; set; }
// ...
}
// Service
public class AccountService
{
public async Task<AccountDetails> GetAccountDetails(string accountNumber)
{
using var client = new HttpClient();
var url = Constant.GetAccountBalanceUrl + accountNumber;
var response = await client.GetAsync(url);
response.EnsureSuccessStatusCode();
var json = await response.Content.ReadAsStringAsync();
var model = JsonConvert.DeserializeObject<AccountDetails>(json);
model.Balance = await GetAccountBalance(accountNumber);
return model;
}
public async Task<string> GetAccountBalance(string accountNumber)
{
// similar approach as above to get the account balance, as it sounds like it
// may come from a different source based on your question
}
}
然后,每當您需要加載 model 時,您只需調用GetAccountDetails
方法並提供所需的任何信息(我在本例中假設為accountNumber
)並等待它返回的任務。 假設我正確理解您的問題,等待該任務的結果將包含 model,余額存儲在Balance
屬性中。
因此,在一遍又一遍地查看問題之后,我決定通過等待第一個任務來嘗試安德魯的想法,獲得一個成功的響應,然后等待第二個任務,在成功時,將余額插入集合中。 所以,這就是我的 ViewModel 在這個過程之后的樣子......
private async void LoadMyAccounts()
{
IsBusy = true;
HttpClient client = new HttpClient();
var url = Constant.GetLinkedAccountsUrl;
var response = await client.GetAsync(url);
var json = await response.Content.ReadAsStringAsync();
Account userAccounts = JsonConvert.DeserializeObject<Account>(json);
List<MyAccount> sorted = userAccounts.Accounts;
//getTrans = userTransactions
var allAccounts = new ObservableCollection<MyAccount>(sorted);
AccountsData = allAccounts;
acctCounts = AccountsData.Count;
//List<MyAccount> BalanceArray = new List<MyAccount>();
foreach (var acct in userAccounts.Accounts)
{
string newAcctNo = acct.Details.AccountNumber;
HttpClient clientee = new HttpClient();
var urlee = Constant.GetAcctBalanceUrl + newAcctNo;
var responseee = await clientee.GetAsync(urlee);
responseee.EnsureSuccessStatusCode();
var jsonee = await responseee.Content.ReadAsStringAsync();
var model = JsonConvert.DeserializeObject<AcctModel>(jsonee);
MyAccount ball = model.Balances;
acct.accountBalance = ball.accountBalance;
//AccountsData.Add(ball);
}
IsBusy = false;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.