promise,Generator函数,async函数区别与理解

promise,Generator函数,async函数区别与理解

promise,generator函数和async函数是es6中的三个比较重要的新语法,都是用来解决异步操作为问题的,初学时只知道三者大概怎么用,但是最关键的三者到底有什么区别,什么时候可以用到这些认识都很模糊。这里对这三者进行一下个人理解的记录

Promise

promise比较简单,也是最常用的,主要就是将原来的用回调函数的异步编程方法转成用relsove和reject触发事件, 用then和catch捕获成功或者失败的状态执行相应代码的异步编程的方法

//回调写法
function fun1(value,callback) {
	value++
	setTimeout(function() {
			value++
        setTimeout(function(){
        		value++
           setTimeout(function(){
				console.log(value)
           }2000)}2000);
	,2000)}
fun1() // 4

//Promise写法
function fun1(value) {
	retrun	new Promise((resolve,reject)=> {
        setTimeout(function(callback){
      		resolve(value++)
    	}2000)}) 
}

fun1(0).then((value)=> {
    return 	new Promise((resolve,reject)=> {
        setTimeout(function(callback){
      		resolve(value++)
    	}2000)}).then((value)=> {
	return 	new Promise((resolve,reject)=> {
        setTimeout(function(callback){
      		resolve(value++)
    	}2000)}).then(value)=>{
    console.log(value) 
}    // 4

由上面代码可以看出 promise将多个回调函数嵌套的回调地狱 ,变成了链式的写法 ,可读性更高写法也更清晰

Generator函数

Generator函数是将函数分步骤阻塞 ,只有主动调用next() 才能进行下一步 ,因为asyns函数相当于Generator函数的语法糖,做出了优化,所以这里对Generator函数不做赘述,而且一般用到异步编程的时候一般也只用async和promise。所以这里就省略了,
额。。。这里改一下,因为dva中异步处理的实现就是Generator函数,所以还是挺有用的,当然dva中自己带状态机使函数自动运行下去。

async函数

简单的说async函数就相当于自执行的Generator函数,相当于自带一个状态机,在await的部分等待返回, 返回后自动执行下一步。而且相较于Promise,async的优越性就是把每次异步返回的结果从then中拿到最外层的方法中,不需要链式调用,只要用同步的写法就可以了。更加直观而且,更适合处理并发调用的问题。但是async必须以一个Promise对象开始 ,所以async通常是和Promise结合使用的

//回调写法
function fun1(value) {
	retrun	new Promise((resolve,reject)=> {
        setTimeout(function(callback){
      		resolve(value++)
    	}2000)}) 
}

fun1(0).then((value)=> {
    return 	new Promise((resolve,reject)=> {
        setTimeout(function(callback){
      		resolve(value++)
    	}2000)}).then((value)=> {
	return 	new Promise((resolve,reject)=> {
        setTimeout(function(callback){
      		resolve(value++)
    	}2000)}).then(value)=>{
    console.log(value) 
}    // 4

//async函数写法
function fun1(value) {
	retrun	new Promise((resolve,reject)=> {
        setTimeout(function(callback){
      		resolve(value++)
    	}2000)}) 
}

async function asy() {
let v = 0
    v = await fun1(v)
    v = await fun1(v)
    v = await fun1(v)
    console.log(v)
}  
asy() //4

从上面代码来看await函数的写法确实简洁了很多,而且异步的顺序也非常清晰

总的来说,async和generator函数主要就是为了解决异步的并发调用使用的 ,直接将参数从then里取出来,相比promise的链式调用,传参更加方便,异步顺序更加清晰
  • 4
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
PromiseGenerator 函数Async 函数都是 JavaScript 中用于处理异步编程的工具。 Promise 是 ES6 中引入的一种异步编程解决方案,通过 Promise 对象可以更方便地进行异步操作的管理和流程控制。Promise 对象有三种状态:pending(等待中)、fulfilled(已成功)和 rejected(已失败),可以通过 then 方法来注册回调函数,处理 Promise 对象的状态变化。 下面是一个使用 Promise 的示例: ```javascript function fetchData() { return new Promise((resolve, reject) => { // 异步操作 setTimeout(() => { const data = { name: 'John', age: 30 }; if (data) { resolve(data); // 成功回调 } else { reject(new Error('fetch data error')); // 失败回调 } }, 1000); }); } fetchData().then(data => { console.log(data); // 输出 { name: 'John', age: 30 } }).catch(error => { console.error(error); }); ``` Generator 函数是 ES6 中引入的一种特殊的函数,可以通过 yield 语句来控制函数的执行流程。Generator 函数的执行结果是一个迭代器对象,可以通过 next 方法来控制 Generator 函数的执行。Generator 函数可以用于异步编程,通过 yield 语句来暂停函数的执行,等待异步操作完成后再继续执行。 下面是一个使用 Generator 函数的示例: ```javascript function* fetchData() { const data = yield new Promise((resolve, reject) => { // 异步操作 setTimeout(() => { const data = { name: 'John', age: 30 }; if (data) { resolve(data); // 成功回调 } else { reject(new Error('fetch data error')); // 失败回调 } }, 1000); }); console.log(data); // 输出 { name: 'John', age: 30 } } const iterator = fetchData(); const promise = iterator.next().value; promise.then(data => { iterator.next(data); }).catch(error => { console.error(error); }); ``` Async 函数是 ES7 中引入的一种新的异步编程解决方案,是 Generator 函数的语法糖。Async 函数可以让异步操作的代码看起来像同步操作的代码,使用起来更加简单明了。Async 函数的执行结果是一个 Promise 对象,可以通过 then 方法来注册回调函数。 下面是一个使用 Async 函数的示例: ```javascript async function fetchData() { try { const data = await new Promise((resolve, reject) => { // 异步操作 setTimeout(() => { const data = { name: 'John', age: 30 }; if (data) { resolve(data); // 成功回调 } else { reject(new Error('fetch data error')); // 失败回调 } }, 1000); }); console.log(data); // 输出 { name: 'John', age: 30 } } catch (error) { console.error(error); } } fetchData(); ``` 这三种工具的使用方式和语法不同,PromiseAsync 函数都是基于回调的方式处理异步操作,而 Generator 函数则是通过 yield 语句来控制异步操作的执行流程。Async 函数相比 PromiseGenerator 函数更加简单明了,可以让异步操作的代码看起来更像同步操作的代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值