Javascript 使用异步等待和.then组合

Javascript 使用异步等待和.then组合,javascript,node.js,asynchronous,promise,async-await,Javascript,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 => { //h

同时使用
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;
  }
异步函数可以包含暂停函数的等待表达式 执行异步函数并等待传递的承诺 解析,然后恢复异步函数的执行和 返回已解析的值

正如您从下面的示例中看到的,您可以使用两种方法来处理wait结果和错误,关键字wait使JavaScript等待,直到该承诺解决并返回其结果(您从已解决的承诺中得到的结果)。因此,没有什么害处(我不完全理解您在这里所指的害处)

函数返回承诺(val){
返回新承诺((解决、拒绝)=>{
如果(val>5){
解决(“已解决”);//已完成
}否则{
拒绝(“拒绝”);//拒绝
}
});
}
//这就是如何处理wait中的错误
异步函数apicall(){
试一试{
控制台日志(等待返回承诺(5))
}捕获(错误){
console.log(错误)
}
}
异步函数apicall2(){
让数据=等待返回承诺(2)。捕获((错误)=>{
console.log(错误)
})
}
apicall2();

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

async function f() {

  try {
    let response = await fetch('http://no-such-url');
  } catch(err) {
    alert(err); // TypeError: failed to fetch
  }
}
在您的承诺中,请使用:

抛出新错误(“oops!”)


Promise.reject(新错误(“哎哟!”)

我总是使用
async/await
.catch()
而不是使用
async/await
try/catch
来精简代码

async函数asyncTask(){
抛出新错误(“网络”)
}
异步函数main(){
const result=await asyncTask().catch(错误=>console.error(错误));
console.log('result:',result)
}

main()
不想让死人复活,但要指出,使用
wait
then
链意味着:

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

x
的值被指定为
的返回值。然后
,这对我来说不是非常直观。

我想
另一个调用
会调用
。然后
调用?对不起,忘了。现在加进去了。不,没有害处。使用
wait
,您只是将承诺链的最终值传递给
结果
变量。我一直都在使用它,这比使用要好。然后+另一个匿名异步函数,它使整个事情变得模糊。您的方式我没有想到,但我真的很喜欢!我通常以相反的方式混合它们,使用带有wait和using的try/catch语句。然后对已解析的承诺执行额外的转换或任何操作。假设在
result=
行之后有更多代码。假设有一个错误。
result
是否未定义?@jeffpadget是的,您可以从
.catch()
方法返回回退值。您介意使用
.catch()
方法的回退更新您的答案吗?@jeffpadget更新的答案。