一起使用async await和.then

时间:2019-03-06 09:27:26

标签: node.js asynchronous promise async-await

同时使用async/await.then().catch()有什么危害,例如:

async apiCall(params) {
    var results = await this.anotherCall()
      .then(results => {
        //do any results transformations
        return results;
      })
      .catch(error => {
        //handle any errors here
      });
    return results;
  }

5 个答案:

答案 0 :(得分:1)

  

异步函数可以包含一个await表达式,该表达式会暂停   执行异步功能并等待传递的Promise   解决,然后恢复异步函数的执行和   返回解析值。

从下面的示例中可以看到,您可以使用两种方法来处理await结果和错误,关键字await使JavaScript等待该promise稳定并返回其结果。因此,这没有什么害处(我不完全了解您所说的伤害)。

function returnpromise(val) {
  return new Promise((resolve, reject) => {
    if (val > 5) {
      resolve("resolved"); // fulfilled
    }
    else {
      reject("rejected"); // rejected
    }
  });
}

//This is how you handle errors in await
async function apicall() {
  try {
    console.log(await returnpromise(5))
  }

  catch (error) {
    console.log(error)
  }
}

async function apicall2() {
  await returnpromise(8).then((re) => {
    console.log(re)
  }).catch((error) => {
    console.log(error)
  })
}

apicall2();
apicall();
有关更多参考,请参阅-MDN DOCS

答案 1 :(得分:1)

不想复活死者,但想指出使用 awaitthen 链意味着:

const x = await someAsyncFn().then(() => doSomeLogging());

x 的值被分配了 .then 的返回值,这对我来说不是很直观。

答案 2 :(得分:0)

如果您使用Async / await,则无需链接.then(),只需将您resolve()返回的结果存储在变量中(示例中为response),但是如果需要处理错误,您必须尝试/捕获代码:

async function f() {

  try {
    let response = await fetch('http://no-such-url');
  } catch(err) {
    alert(err); // TypeError: failed to fetch
  }
}

在您的诺言中使用:

throw new Error("oops!");

Promise.reject(new Error("Whoops!"));

答案 3 :(得分:0)

我总是使用async/await.catch()而不是使用async/awaittry/catch来紧凑地编写代码。

async function main() {
  const result = await asyncTask().catch(error => console.error(error));
}

答案 4 :(得分:0)

我不认为混合使用 async/await + then 是个好主意。尤其是当你专注于 async func 的 res 时,混合使用会带来一些风险,悄悄地扭曲你的 res。

示例:

const res = await fetchData().then(()=>{return "something else"}).catch((err)=>{});

console.log(res); // not expected res data but something else

所以,混合使用是危险的,顺便说一句,它会损害阅读代码。