ES6的promise和Jq的promise的区别

在说两者之间的区别时,我们先说一些关于ES6的promise和Jq的promise的基础知识;

一.Jq的promise

  •     deferred.promise()和$().promise()的区别

$().promise()方法返回一个动态生成的Promise,一旦绑定到已排队或未排队的集合的某个类型的所有操作都已结束,该Promise将被解析。示例可以参考https://api.jquery.com/promise/

Deferred对象有resolve()和reject()方法,可以直接随时修改该对象的状态。deferred.promsie()其实就是一个去除了resolve和reject方法的deferred对象,可以返回一个jquery版本的promise对象,目的是防止意外的修改了promise对象的状态,影响真正的异步操作。但是要弄懂deferred.promsie()我们首先要来熟悉deferred对象。

  • deferred对象

首先我们定义一个对象,var defer = $.Deferred();试一下在控制台输出这个实例console.log(defer);

输出的defer实例对象方法中我们可以分为两类,

一类是可以绑定额外的处理或判断状态的延迟方法:then, done, fail, always, pipe, progress, state,和 promise

另一类是改变状态的延迟方法:resolve, reject, notify, resolveWith, rejectWith, 和 notifyWith。

我们借用官网上经典的例子分析一下:

上述中我们用new jQuery.Deferred()创建了一个实例dfd,执行过程:dfd.state()的状态初始是pending,会打印出“working...”,之后如果到了解决(resolve)和拒绝(reject)这两个方法其中一个的设置时间,那么就会执行其中一个的定时器,而另一个不会执行。

dfd.state()的值有三个:pending(进行中);resolved(成功) ;rejected(失败)。

那么上述代码中的dfd.promise又起到什么作用呢

我们上面说到Deferred对象可以直接随时修改该对象的状态,但如果给对象加上promise方法,如dfd.promsie();那么该对象的运行状态,延迟方法不可以再改变(也就是说promise对象不允许你调用resolve和reject方法,promise是deferred的只读版,或者更通俗地理解成promise是一个对将要完成的任务的承诺。)。

附上示例代码地址:https://www.runoob.com/jquery/misc-deferred-promise.html

二.ES6的promise

对于es6的基础知识在这我就不多说了,昨天面了一家公司,问到我promise的异步原理,感觉自己答的不是很好,重新总结一下;

要理解Promise的执行原理,首先要知道EMCAScript的任务队列机制——macro-task(宏任务)和micro-task(微任务)。

macrotasks: setTimeout, setInterval, setImmediate, I/O, UI rendering

microtasks: process.nextTick, Promise, MutationObserver

javascript是单线程的,主线程拥有一个执行栈以及一个任务队列,主线程会依次执行代码,当遇到异步函数时候,会先将该函数入栈,所有主线程函数运行完毕后再将异步函数出栈,直到所有的异步函数执行完毕即可。

ES6中promise的异步就是将 Promise 构造函数中 resolve,reject 方法和注册的 callback 转化为 eventLoop的 microtask,并放到 Event Loop 队列中等待执行,主线程执行完成任务后又会检查microtasks队列并完成里面的所有任务后再执行macrotask的任务。

 

 

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值