export class newPromise {
constructor(executor) {//new 实例 传入一个函数
executor(this.resolve, this.reject)
}
status = PENDING
res = undefined
result = undefined
resolve = (value) => {//resolve方法 将pendding 变成fulfilled
if(this.status !== PENDING) return
this.status = FULFILLED
this.res = value
}
reject = result => {//reject 方法:将pendding 变成reject
if(this.status !==PENDING) return
this.status = REJECTED
this.result = result
}
then = (successCallback,failCallBack) => {//then方法
if(this.status === FULFILLED) {
successCallback(this.value)
}else if(this.status == REJECTED) {
failCallBack(this.result)
}
}
}
Promise 新建后就会立即执行。then方法指定的回调函数,将在当前脚本所有同步任务执行完才会执行,
上面代码中,promise抛出一个错误,就被catch()方法指定的回调函数捕获。注意,上面的写法与下面两种写法是等价的。
// 写法一
const promise = new Promise(function(resolve, reject) {
try {
throw new Error('test');
} catch(e) {
reject(e);
}
});
promise.catch(function(error) {
console.log(error);
});
// 写法二
const promise = new Promise(function(resolve, reject) {
reject(new Error('test'));
});
promise.catch(function(error) {
console.log(error);
});
const someAsyncThing = function() {
return new Promise(function(resolve, reject) {
// 下面一行会报错,因为x没有声明
resolve(x + 2);
});
};
someAsyncThing().then(function() {
console.log('everything is great');
});
setTimeout(() => { console.log(123) }, 2000);
// Uncaught (in promise) ReferenceError: x is not defined
// 123
上面代码中,someAsyncThing()函数产生的 Promise 对象,内部有语法错误。浏览器运行到这一行,会打印出错误提示ReferenceError: x is not defined,但是不会退出进程、终止脚本执行,2 秒之后还是会输出123。这就是说,Promise 内部的错误不会影响到 Promise 外部的代码,通俗的说法就是“Promise 会吃掉错误”。
p = Promise.all方法: 将多个promise实例 包装成一个新的promise 实例
接受一个数组作为参数
两种情况:
只有当素有状态都变成fulfilled p 才会变成fulfilled 返回一个数组
只要有一个别 rejected p 就变成 reject 第一个失败的被返回
p = Promise.rece() jiang duoge pormise 实例 包装成一个新的pormise实例
只要有一个实例改变状态 p 的状态就跟着高边,率先改变的实例返回值
参数方法和promise.all() yiyang rug bushi pormise 实例 就会先调用 Promise.reoslve() 方法 将参数转为 Promise 实例 在进一步处理