Promise、Generator、async关于异步处理的比较

      ES6提供了三种异步编程的解决方案,分别是Promise对象,Generator函数和async函数。Promise对象在之前的文章中(https://blog.csdn.net/qq_26834399/article/details/79701757)已经有过讲解。今天主要介绍一下Generator和async函数,以及三者解决异步处理的区别和联系。

      Generator就是一个封装好的异步任务函数,有两个区别于普通函数的特征。一是在function关键字与函数名之间有个*,二是函数内部通过yield语句标明异步操作。只有通过next方法才能使函数执行,代码执行过程中,每次遇到yield或return都会暂停执行,直到再次执行next方法。每次执行next都会返回一个对象。

{
    value:'',    //当前执行代码的返回值
    done:false    //布尔值,Generator函数是否执行完
}

      下面是使用Generator函数实现异步操作的例子

function* gen(){
    var result = yield Promise.resolve({"name":"Annie"})
    console.log("in gen :",result);
}

var g=gen();
var r=g.next();

console.log("out gen",r)

r.value.then(function(data){
    console.log("in r then",data);
    g.next({"name":"Keith"});
})

      例子中,使用Promise来模拟一个异步操作,当第一次执行next的时候,返回值是一个value为Promise对象的,done为false的遍历器(Iterator)对象。在promise的then中再次执行next,则继续执行generator函数中的代码。其中next接受的参数,可以传入generator函数中,作为上一阶段异步任务的返回结果。执行结果如下:

      由上面的例子可以看出,使用Generator函数实现异步任务,需要手动执行next才能执行下去,如何能让代码自动执行呢?这时就用到了async函数。async就是Generator函数的语法糖,对Generator函数进行了包装和处理。将Generator函数的*换成了async,yield换成了await,语义更明确。且增加了内置执行器,无需再执行next,代码就可以自动执行并输入最后的结果。

      上述例子可使用async改写

async function gen(){
    var result = await Promise.resolve({"name":"Annie"})
    console.log("in gen :",result);
}

var r=gen();

console.log("out gen",r)

r.then(function(){
    var data = {"name":"Keith"};
    console.log("in r then",data);
    return data
})

      改写后,无需再使用next执行代码,在promise状态由pending变为resolved后,async函数中后面的代码也自动执行了,执行结果如下

      总结来说,Promise的写法,需要暴露Promise的API,then、catch、finally等;Generator函数必须自定义一个自执行器,且保证每个yield语句后的表达式返回的都是Promise对象;async实现最简洁,最语义化。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Promiseasync和await是JavaScript中用于处理异步操作的关键字。它们的实现原理如下: 1. PromisePromise是一种表示异步操作的对象,它包含三种状态(pending、fulfilled、rejected)。当一个异步操作完成时,Promise可从pending状态转变为fulfilled状态,表示操作成功;或者从pending状态转变为rejected状态,表示操作失败。Promise提供了then方法来处理操作的结果,并可以进行链式调用。 2. async/await:async函数是Generator函数的一种语法糖,用来简化异步操作的处理。通过在函数前添加async关键字,函数返回值将被自动封装成Promise对象。await关键字只能在async函数中使用,用于暂停async函数的执行,等待Promise对象的状态改变后再继续执行。当await后面的异步操作完成时,它会返回Promise对象的结果。 下面以一个获取用户信息的案例来分析Promiseasync和await的用法: 使用Promise实现: ``` function getUserInfo() { return new Promise((resolve, reject) => { setTimeout(() => { const user = { name: 'John', age: 25 }; resolve(user); }, 1000); }); } getUserInfo() .then(user => { console.log(user); }) .catch(error => { console.error(error); }); ``` 使用async/await实现: ``` function getUserInfo() { return new Promise((resolve, reject) => { setTimeout(() => { const user = { name: 'John', age: 25 }; resolve(user); }, 1000); }); } async function displayUserInfo() { try { const user = await getUserInfo(); console.log(user); } catch (error) { console.error(error); } } displayUserInfo(); ``` 以上两种方式都可以获取用户信息,并在操作完成后打印到控制台。使用async/await可以使代码看起来更加简洁和易读。通过在async函数内部使用await关键字,可以将异步操作的代码写成类似同步代码的形式,提高了代码的可读性和可维护性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值