Proxy
vue3.0应用该特性替代Object.defineproperty
解决的痛点:
- 监听不到属性的添加和删除
- 监听数组索引和长度的变更
- 不能支持Map,Set,WeakMap和WeakSet
Promise A+规范
参考文章
Promise/A+翻译
手撕遵循 Promise/A+ 规范的 Promise
手把手教你实现 Promise
MDN
要求
-
promise状态:Pending,Fulfilled and Rejected
Pending=>Fulfilled or Rejected
Fulfilled必须有一个不可改变的值,且不可再转换状态
Rejected必须有一个不可改变的原因,且不可再转换状态
-
then方法
promise必须提供一个
then
方法以访问它当前或最终的值或被拒绝的原因promise.then(onFulfilled,onRejected);
-
onFulfilled
和onRejected
都是可选参数,如果不是函数将忽略 -
onFulfilled
和onRejected
如果是函数:- 它们必须在promise完成/拒绝后被调用,并且以promise的值/原因作为它的第一个参数
- promise完成/拒绝前不可调用
- 仅可调用一次
-
onFulfilled
和onRejected
只有在执行上下文堆栈仅包含平台代码是才可被调用 -
onFulfilled
和onRejected
必须作为函数调用 -
then
在相同的promise可以被调用多次当promise是完成/拒绝时,相应的回调函数必须按其原始调用的顺序执行
-
then
方法必须返回一个promisepromise2 = promise1.then(onfulfilled,onRejected);
-
如果
onFulfilled
或onRejected
返回一个值x
,则运行[[Resolve]](promise2,x)
promise2=new Promise(resolve=>resolve(10)).then(()=>1)
这个例子将会运行
[[Resolve]](promise2,1)
,结果将在下面解决过程分析 -
如果
onFulfilled
或onRejected
抛出一个异常e
,则promise2
拒绝执行,返回拒因e
-
如果
onFulfilled
不是函数且promise1成功执行,promise2
必须成功执行并返回相同的值 -
如果
onRejected
不是函数且promise1拒绝执行,promise2
必须拒绝执行并返回相同的拒因
-
-
-
Promise解决过程
该过程比较复杂,配合看点实例。
一个抽象的操作,它接收一个promise和一个值,我们可以表示为
[[Resolve]](promise,x)
,如果x
是一个thenable对象,解决程序将试图接受x
的状态,否则用x
的值来执行promise。这种对thenable的处理具有普适性。
运行
[[Resolve]](promise,x)
的步骤:promise
和x
指向同一对象,则以TypeError
作为拒因拒绝执行
明显这个性质是为了防止循环引用let promise2 = new Promise(resolve=>resolve(10)).then(()=>promise2) =>Uncaught (in promise) TypeError: A promise cannot be resolved with itself.
-
x
是一个promise,那么promise将接受它的状态:Pending:promise必须保留状态直到
x
被完成或者被拒绝Fulfilled:用相同的值执行promise
Rejected:用相同的原因拒绝promise
let promise1 = new Promise(resolve=>resolve(0)) console.log(promise1) =>Promise { <state>: "fulfilled", <value>: 0 } let promise2 = new Promise(resolve=>resolve(promise1)) console.log(promise2) =>Promise { <state>: "fulfilled", <value>: 0 } console.log(promise2 == promise1) =>false
可以看到then方法返回的是与promise1相同的状态和值,而且返回的promise是新的promise
-
x
是一个对象或者一个函数:-
x.then
赋值给then
-
如果取
x.then
的值时抛出错误e
,则以e
为拒因拒绝promise
-
then
是函数,将x
作为函数的作用域this来调用它。传递两个回调函数作为参数,为resolvePromise
和rejectPromise
-
如果
resolvePromise
以y
为参数被调用,执行[[Resolve]](promise,y)
;let promise1 = new Promise(resolve=>resolve({ then(resolve,reject){ resolve(1)} })) console.log(promise1) =>Promise { <state>: "fulfilled", <value>: 1 }
运行了resolve(1)的过程;
-
如果
rejectPromise
以r
原因被调用,则以拒因r
拒绝promise
-
-