我可以在没有.then的情况下使用async await吗?

时间:2017-11-21 12:36:45

标签: javascript asynchronous async-await

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

4 个答案:

答案 0 :(得分:1)

异步函数声明async function loadData()返回AsyncFunction,它以异步方式执行,并始终返回Promise

基本上你放在async function someFunctionName中的所有代码都将在Promise内执行,当你return在函数内部有一些值时 - 它将解决这个问题。

因此then()调用是从函数返回的Promise中获取实际值。

答案 1 :(得分:1)

首先,所有异步函数都返回一个Promise,所以如果你想从异步操作中获取返回值,你需要在异步函数中使用thenawait

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的使用。