promise,async和await的使用

本文深入探讨了JavaScript中async/await与Promise的使用方法,包括如何通过async函数执行返回Promise的函数,处理异步代码使其更接近同步代码的编写方式,以及如何使用Promise.all处理多个Promise的结果。

await后面接一个会return new promise的函数并执行它
await只能放在async函数里

  1. 使用async和await获取成功结果
function yao(){
	return new Promise((resolve,reject){
		let  sino = parseInt(Math.random()*6+1)
		setTimeout(()=>{
			resolve(sino)
		},3000)
	})
}
asnyc function test(){
	let = await yao()
}
test()

async中使 await yao() 先执行,等到三秒后执行完再把得到的结果赋值给左边的n,也就是说test函数需要三秒钟才执行完成,所以test函数是异步的,因此前面必须写async

  1. 获取失败的结果
function yao(reason){
	return new Promise((resolve,reject)=>{
		let sino = parseInt(Math.random()*6+1)
		
		if(sino>3){
			if(reason == '大'){
				resolve(sino)
			}else{
				reject(sino)
			}
		}else{
			if(reason == '大'){
				reject(sino)
			}else{
				resolve(sino)
			}
		}
	})
}
async function test(){
	// await和成功之后的操作放到try里,失败的放在catch
	try{
		let n = await yao('大')
		console.log('赢了'+n)
	}catch(error){
		console.log('输了'+error)
	}
	
}
test() 

使用await使我们的异步代码,更像同步的代码

  1. 如果有多个promise,怎么拿到所有的promise都结束后的结果?
    比如有两个色子,我想得到这两个色子的点数
//方法一
function yao(reason){
	return new Promise((resolve,reject)=>{
		let sino = parseInt(Math.random()*6+1)
		if(sino>3){
			if(reason == '大'){
				resolve(sino)
			}else{
				reject(sino)
			}
		}else{
			if(reason == '大'){
				reject(sino)
			}else{
				resolve(sino)
			}
		}
	})
}
// Promise.all里面是一个数组
// then两个参数fn
	// 第一个参数:调用成功,返回所有promise的结果,是一个数组的形式,
	// 第二个参数拿到的是第一个失败的值
Promise.all([yao('大'),yao('大'),yao('大'),yao('小')]).then(
	(x)=>{  //成功的数组
		console.log("x")
		console.log(x)
	},
	(y)=>{ //失败的第一个结果
		console.log("y")
		console.log(y)
	}
)
// 2.使用await
async function test2(){
	// await和成功之后的操作放到try里,失败的放在catch
	try{
		let n = await Promise.all([yao('大'),yao('大'),yao('大'),yao('小')])
		console.log(n) //所有都成功返回一个数组
	}catch(error){
		console.log(error) //返回第一个失败的数据
	}
}
test2()

以上是promise的一些异步使用,配合async和await使用更方便。

### JavaScriptPromiseasync await 的关系及用法 #### 一、Promise 基础 `Promise` 对象代表了一个异步操作的最终完成(或失败)及其结果值。它有三种状态:待定(pending),已实现(fulfilled)被拒绝(rejected)[^3]。 创建 `Promise` 实例通常是为了封装一些耗时的操作,比如网络请求或者文件读取: ```javascript const eatBreakfast = () => { return new Promise((resolve, reject) => { setTimeout(() => { resolve('吃早饭'); }, 1000); }); }; ``` 此代码片段展示了如何通过返回一个新的 `Promise` 来表示一个简单的异步动作——模拟花费一秒时间来“吃早餐”。当这个过程结束时,调用 `resolve()` 方法传递成功的结果给后续链上的回调函数[^4]。 #### 二、使用 then() 处理 Promise 结果 一旦有了 `Promise`,就可以利用 `.then()` 方法注册成功的处理程序以及可选的错误处理器`.catch()`: ```javascript eatBreakfast().then(message => console.log(message)).catch(error => console.error(error)); // 输出 "吃早饭" ``` 这段代码会在 “吃早饭”的承诺兑现之后打印消息;如果过程中发生任何异常,则会被捕获并记录下来[^2]。 #### 三、引入 async/await 提升可读性维护性 为了改善传统基于回调的方式所带来的“回调地狱”,即多层嵌套难以管理的情况,ES8 引入了 `async` `await` 关键词作为更优雅地编写异步逻辑的方法之一。 - **Async Function**: 定义带有 `async` 关键字前缀的函数意味着该函数内部可以安全地使用 `await` 表达式,并且总是隐含地返回一个 `Promise`。 - **Await Expression**: 当在一个 `async` 函数体内遇到 `await` 操作符时,执行流程将会暂停在此处直至对应的 `Promise` 被解决或拒收为止,在这期间不会阻塞其他任务继续运行[^1]。 下面是一个改进版的例子,展示怎样运用这些特性让复杂的异步序列看起来像是顺序执行的一样直观易懂: ```javascript async function dailyRoutine() { try { let breakfastMessage = await eatBreakfast(); console.log(breakfastMessage); // 这里还可以加入更多类似的异步活动... } catch (error) { console.error(`遇到了一个问题: ${error}`); } } dailyRoutine(); ``` 在这个例子中,`dailyRoutine` 是一个异步函数,其中包含了对另一个异步方法 `eatBreakfast` 的调用。由于用了 `await`,所以即使实际发生了延迟,“吃早饭”这条语句也会按照预期顺序被执行完毕后再往下走,从而大大提高了代码的清晰度易于理解的程度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值