异步/等待链接何时停止?

When does the async / await chaining stop?

我正在测试节点获取,当我使用异步/等待时,出现了一个问题:如果我在其中使用等待,我必须使我的函数异步但是因为我的函数是异步的我需要等待它并且使父函数异步。等等......上下文:

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;
}

}

如何停止此异步/等待链接?我的程序中有一种方法使用 fetch,它会让我将所有其他方法转换为异步方法。这真的是所有其他使用 fetch 开发的程序的样子吗?也许我对 async/ await 不理解。

感谢您的宝贵时间:)

在脚本开头调用异步函数一次。在其响应返回后,用结果同步调用脚本的其余部分。大致如下:

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 格式的字符串,而是一个普通值,通常是一个对象或数组)

从非异步方法调用异步方法。

简答:

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;
}