Как правильно сделать асинхронный вызов в цикле? - PullRequest
1 голос
/ 07 марта 2019

Может кто-нибудь предложить правильный способ, как я могу сделать асинхронный вызов одновременно со значениями, извлеченными из массива?

В настоящее время у меня есть реализация ниже, но это выглядит как код блокировки из-за await , который в основном ожидает результата вызова API, прежде чем перейти к следующей итерации.

Ваши предложения будут высоко оценены.Заранее спасибо!:)

async function getDetailsById(){
    let idArr = ['1000', '1001', '1002', '1003'];
    let detailsArray = [];
    for(let i = 0; i < idArr.length; i++){
        let id = idArr[i];
        let details = await callSomeApi(id);
        detailsArray.push(details);
    }
   return detailsArray;
}

1 Ответ

0 голосов
/ 12 марта 2019

Вы можете запустить все задачи, а затем ждать задачи. Когда все (...) ;

Я не знаю, как это сделать на вашем языке, но выполучить суть:

List<Task<returnType>> tasks = new List<Task<returnType>>();
// start all tasks, don't await for the result yet
for (int i=0; i<idArr.Length; ++i)
{
    Task task = callSomeApi(idArr[i]);
    tasks.Add(task);
}

// wait until all tasks finished:
await Task.Wait(tasks);

// if desired use Task.Result to use the return value:
foreach(Task<returnType> task in tasks)
{
    var result = task.Result;
    ProcessResult(result);
}

Если вы не хотите ждать завершения всех задач, но хотите обработать результат, как только одна из задач будет завершена, используйте Task.WhenAny и удалитеГотовое задание из коллекции ожидаемых заданий.Используйте HashSet для быстрого удаления

HashSet<Task<returnType>> tasks = new HashSet<Task<returnType>>();
// start all tasks, don't await for the result:
for (int i=0; i<idArr.Length; ++i)
{
    Task<returnType> task = callSomeApi(idArr[i]);
    tasks.Add(task);
}

// as long as there are tasks in the HashSet, 
// await until any of the tasks in the HashSet is finished:
while(tasks.Any())
{
    Task finishedTask = await Task.WhenAny(tasks);
    tasks.Remove(finishedTask);
    ProcessResult(finishedTask.Result); // only if there is a result
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...