-
Notifications
You must be signed in to change notification settings - Fork 5
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
JS-ES6-Promise/Promise A+规范 #112
Comments
一、ES2015 Promise1.1 概述
1.2
|
Promise Resolve函数一、概述Promise构造函数的实参函数和thenable对象的 二、执行逻辑ES6的实现逻辑完全符合The Promise Resolution Procedure`,但此外还有些额外的逻辑: [[Resolve]](promise, x)
2.1
|
一道关于Promise应用的面试题
为了方便演示,增加额外的条件:只需要循环3次。 1. Promise最常规实现function red () {
console.log('red')
}
function green () {
console.log('green')
}
function yellow() {
console.log('yellow')
}
var tic = function(timmer, cb){
return new Promise(function(resolve, reject) {
cb();
setTimeout(resolve, timmer);
});
}
var round = 0;
var maxRound = 3;
;(function step() {
if(++round > maxRound ) {
return;
}
console.log(`Round ${round}`)
tic(3000, red)
.then(function() {
return tic(2000, green)
})
.then(function() {
return tic(1000, yellow)
})
.then(step)
})() 2. 使用
|
更多练习1. 实现
|
如何实现一个Promise请求池?源于思否上的一个提问:如何实现一个Promise请求池?。 function PromisePool(maxSize) {
const queue = [];
let activeCount = 0;
function push(action) {
// 返回个promise对象,方便后续使用(比如结合`Promise.all`等)
return new Promise((resolve, reject) => {
queue.push(async () => {
try {
const result = await action();
resolve(result);
} catch (e) {
reject(e);
} finally {
--activeCount;
run(); // 调用run, 看看还有没有pending的action需要执行
}
}
);
// 调用run, 开始执行
run();
})
}
function run() {
if (activeCount < maxSize && queue.length) {
activeCount++;
const action = queue.shift();
action();
}
}
return push;
}
// TEST
var pp = PromisePool(2);
function genP(msg, delay) {
return new Promise(resolve=>{
setTimeout(()=>{
console.log(msg);
resolve(msg);
}
, delay)
}
)
}
Promise.all([
pp(()=>genP('a', 500)),
pp(()=>genP('b', 100)),
pp(()=>genP('c', 50)),
pp(()=>genP('d', 80))
]).then(result => {
console.log(result)
}) 参考 |
Promise A+规范
一、概述
Promise A+规范重点分为3个部分:
Promise
的状态;then
方法的功能和注册的回调函数调用规则;The Promise Resolution Procedure
1.1
Promise
的状态初始态和终态
pending
状态是Promise对象的初始状态,fulfilled
/rejected
状态是Promise的终态,一个Promise对象的终态二选一。最终值(
value
/reason
)Promise是一个异步操作的结果,当
promise
处于终态时会关联一个最终值:fulfilled
promise对应一个最终结果value
;rejected
promise对应一个最终结果reason
。1.2
then
方法then
方法是必须的无法直接访问Promise对象的终态值,必须通过
then
方法注册回调函数的方式获取Promise的最终值(注意这是唯一的方式):onFulfilled
/onRejected
必须异步调用Promise对象链
then
方法返回值是个新Promise对象,这样就构成一个Promise对象链。1.3
The Promise Resolution Procedure
Promise解决过程主要是描述一个Promise对象如果变成终态的。
基本的原则是:
x
是thenable
对象,则采用x
最终值;fulfill
promise对象。二、
thenable
对象2.1 什么是
thenable
对象Promise A+标准中定义:
Promise
对象也是thenable
对象,但是thenable
对象不一定是Promise
对象。thenable
对象为了兼容非标准的Promise
规范实现。2.2 在
[[Resolve]](promise, x)
中如果x
是thenable
对象看Promises/A+规范吧:把
Promise
对象的resolve
和reject
句柄作为实参调用then
方法。输出:
注意:
在ES2015 Promise实现中
thenable
对象的then
方法调用是异步的,作为微任务下一个时序执行(后面再细说)。三、关于Promise A+规范疑惑点
then
方法返回值promise2
不可以和该then
方法的onFulfilled
或则onRejected
回调函数的返回值result
相同。因为如果
result
和promise2
相等(相等的promise
),则产生跟自身互相引用的局面,永远无法进入终态。JS-ES6-Promise.prototype.then链的误区
The text was updated successfully, but these errors were encountered: