我对async await
的{{3}}感到有点困惑。当.then()
函数已解决时,这些文档使用async
语法进行响应:
mdn示例
async function add() {
const b = await resolveAfter2Seconds(30); // timer
return b;
}
add().then(v => {
console.log(v);
});
但是在我自己的代码中,我不使用.then()
,它仍然可以异步工作。流量未被阻止。那么为什么要使用.then()
?
没有.then的异步代码
function start(){
console.log("starting!")
let d = loadData()
console.log("this message logs before loadData returns!")
console.log(d) // this shows: Promise - Pending because d has not yet returned
}
async function loadData() {
const response = await fetch("https://swapi.co/api/films/");
const json = await response.json();
console.log("data loaded!")
return json;
}
答案 0 :(得分:1)
异步函数声明async function loadData()
返回AsyncFunction
,它以异步方式执行,并始终返回Promise
。
基本上你放在async function someFunctionName
中的所有代码都将在Promise
内执行,当你return
在函数内部有一些值时 - 它将解决这个问题。
因此then()
调用是从函数返回的Promise
中获取实际值。
答案 1 :(得分:1)
首先,所有异步函数都返回一个Promise,所以如果你想从异步操作中获取返回值,你需要在异步函数中使用then
或await
MDN使用.then
,因为add
异步函数是在异步函数范围之外调用的,因此它不能全局使用await
来捕获promise中的数据。
在您的示例中,您获得相同的Promise实例作为loadData
异步函数的返回,如果您将start
函数定义为async,则可以使用{{1} },如果它不是异步,你可以使用let d = await loadData()
(Promise API)。
答案 2 :(得分:0)
您的代码有效,因为它没有返回promise对象并且实际上在等待响应。它返回结束时的json。因此,执行一直持续到获得响应。
如果你的函数是异步的,你不需要返回promise,你的return语句将在它完成之前等待所有'await'语句。
答案 3 :(得分:0)
您自己的代码有效,因为您将.then()
的使用替换为async await
的使用。