I am calling an async
api to get details. The target api
endpoint can change and want to pass it as dynamic function.
Since the pagination of details is same for all apis, how can we make it as delegate
function with async return value?
private async Task<List<Items>> GetItemsAsync(HttpClient client, string arg1)
{
var totalResults = new List<Items>();
int skip = 0, resultsCount = 1;
while (resultsCount != 0)
{
var results = await GetItems(client, arg1, skip);
if (results != null)
{
totalResults.AddRange(results);
resultsCount = results.Count;
skip += resultsCount;
}
else
{
resultsCount = 0;
}
}
return totalResults;
}
private async Task<List<Users>> GetUsersAsync(HttpClient client, string arg1)
{
var totalResults = new List<Users>();
int skip = 0, resultsCount = 1;
while (resultsCount != 0)
{
var results = await GetUsers(client, arg1, skip);
if (results != null)
{
totalResults.AddRange(results);
resultsCount = results.Count;
skip += resultsCount;
}
else
{
resultsCount = 0;
}
}
return totalResults;
}
Something like the following:
private async Task<List<T>> Get<T>(Func<Task<int, int, List<T>>> factory, int skip, int take)
{
var totalResults = new List<T>();
var resultsCount = 1;
while (resultsCount != 0)
{
var results = await factory(skip, take);
if (results != null)
{
totalResults.AddRange(results);
resultsCount = results.Count;
skip += resultsCount;
}
else
{
resultsCount = 0;
}
}
return totalResults;
}
public Task<List<User>> GetUsersAsync(HttpClient httpClient, string arg1)
{
return Get<User>((skip, take) => GetUsers(httpClient, arg1, skip, take), 0, 10);
}
public Task<List<Item>> GetItemsAsync(HttpClient httpClient, string arg1)
{
return Get<Item>((skip, take) => GetItems(httpClient, arg1, skip, take), 10, 10);
}
In some cases the following might also be enough, but not in your case evidently, because it seems you need to do something more with the skip argument:
private async Task<List<T>> Get<T>(Func<Task<List<T>>> factory)
{
...
}
public Task<List<User>> GetUsersAsync(HttpClient httpClient, string arg1)
{
return Get<User>(() => GetUsers(httpClient, arg1, 0, 10));
}
public Task<List<Item>> GetItemsAsync(HttpClient httpClient, string arg1)
{
return Get<Item>(() => GetItems(httpClient, arg1, 10, 10));
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.