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更新的答案。