简体   繁体   中英

Using delegates to call async methods

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM