Когда прекращается цепочка async/await?

Я тестировал node-fetch, и когда я использовал async/await, возник вопрос: я должен сделать свою функцию асинхронной, если я использую в ней ожидание, НО, поскольку моя функция асинхронная, мне нужно дождаться ее и сделать родительскую функцию асинхронной. . И так далее... Контекст:

async functionA()
{
  var result = await functionB();
}

async functionB()
{
  //do things
  var result = await functionC();

  //do things

  var blob;

  //do things

  return blop;
}

async functionC()
{
 //here is the real async call
 var result = await fetch(....);
 var json = await result.json();
 return json;
}

}

Как я могу остановить эту цепочку async/await? У меня есть один метод в моей программе, использующий выборку, и он заставит меня преобразовать все мои другие методы в асинхронный метод. Действительно ли так выглядят все остальные программы, разработанные с помощью fetch? Возможно я что-то не понял с async/await.

Спасибо за ваше время :)


person Lexe.Elf    schedule 20.02.2021    source источник
comment
как только вы пойдете асинхронно, вы действительно не сможете вернуться   -  person Daniel A. White    schedule 21.02.2021
comment
Вам не обязательно использовать await. Вы можете использовать .then   -  person Thomas Sablik    schedule 21.02.2021
comment
Да. Если вы делаете что-то асинхронное в своей программе, вся ваша программа (верхнего уровня) является асинхронной. Но это не означает, что все ваши функции должны стать async.   -  person Bergi    schedule 21.02.2021


Ответы (2)


Вызовите асинхронную функцию один раз в начале сценария. Когда ответ вернется, вызовите остальную часть скрипта с результатом синхронно. Что-то вроде:

async function functionC() {
 //here is the real async call
 const response = await fetch(....);
 const result = await result.json();
 return result;
}

functionC()
  .then((results) => {
    // do stuff with results
    functionA(results);
    functionB(results); // if needed
    // etc
  })
  .catch(handleErrors); // don't forget this part

Таким образом, только одна часть вашего скрипта — рядом с точкой входа — должна обрабатывать асинхронную логику. Для реализации этого может потребоваться некоторый рефакторинг, но это стоит того, чтобы сделать все асинхронным.

(также обратите внимание, что .json, вероятно, разрешается в простой объект или массив - он не разрешается в строку в формате JSON, он анализирует поток ответа, как если бы это был JSON, и разрешается в результат, который больше не является строкой в ​​формате JSON, а является простым значением, обычно объектом или массивом)

person CertainPerformance    schedule 20.02.2021

Вызовите асинхронный метод из неасинхронного метода.

Краткий ответ:

int GetData(DateTime x)
{
    Task<int> taskGetData = Task.Run( () => GetDataAsync(x));
    taskGetData.Wait();
    return taskGetData.Result;
}

async Task<int> TaskGetDataAsync(DateTime x)
{
    ...
}

Более длинный ответ: всякий раз, когда GetDataAsync ожидает (например, ждет, пока данные будут записаны в файл или извлечены из базы данных), ваша процедура может делать что-то еще.

int GetData(DateTime x)
{
    Task<int> taskGetData = Task.Run( () => GetDataAsync(x));

    DoSomethingElse();

    taskGetData.Wait();
    int taskResult = taskGetData.Result;
    return taskResult;
}


    
person Harald Coppoolse    schedule 22.02.2021