Promise的用途
1. 用于异步计算
2. 可以将异步操作序列化,按照期望的顺序进行执行, 返回符合预期的结果
3. 在对象之间传递和操作Promise,帮助我们处理队列
产生的原因
.JavaScript包含大量异步操作。
js为交互检查表单而生。操作DOM
事件监听也是一种异步操作
ajax回调
jquery,$() 页面加载完成后回调
Node.js 无阻塞高并发是Node.js的招牌。异步是其保障,依赖大量回调函数
1. 异步回调的问题,回调地狱。难以维护
2. 无法正常使用return, throw异步回调不能使用try catch捕获错误, 因为函数执行入栈出栈函数不在一个栈里面。
3. 无法正常检索堆栈信息
4 异步无法判断回调的函数是否执行完成,当声明局部变量时,可能会被闭包其他函数修改,导致变量的值不准确。多个回调无法建立联系。
Promise的设计
参数是一个执行器 两个回调函数参数,一个是处理完成 一个是处理出错
如果成功会then的函数,如果识别会执行catch的执行函数。
三个状态 pending fulfilled rejected
当状态改变 触发then的响应的后续步骤,状态改变后不能再次被改变。
Promise一经创建执行器会立刻执行,执行是异步的过程。等待then的处理的函数。
then,可以链式调用 因为promise的then返回的是promise实例。
当我们出现嵌套then,建议把其展开,可读性会更好
回调方法实现promise
let MyPromise = function(executor) {
let resolve = function(res) {
this.success(res);
};
let reject = function(err) {
this.error(err);
};
this.then = function(cb) {
this.success = cb;
return this;
};
this.catch = function(cb) {
this.error = cb;
};
executor(resolve.bind(this), reject.bind(this));
}
let test = function(n) {
return new MyPromise((resolve, reject) => {
setTimeout(() => {
if(n < 5) {
resolve('成功')
}else{
reject('失败')
}
}, 1000)
})
}
let n = (Math.random() * 10).toFixed(0);
test (n).then(res => {
console.log(res)
})
.catch(err => {
console.log(err)
})