Promise补充
Promise规范
/**
* promise 的then方法接受两个参数:promise.then(onFulfilled, onRejected)他们都是可选参数,同时他们都是函数,
* 如果onFulfilled或onRejected不是函数,则需要忽略他们。
* then方法必须返回一个Promise对象
* promise2 = promise1.then(onFulfilled, onRejected);
* 只要onFulfilled或者onRejected返回一个值x,promise 2 都会进入 onFulfilled 状态
* 如果onFulfilled或者onRejected抛出一个异常e,则promise2必须拒绝执行,并返回拒因e
* 如果onFulfilled不是函数且promise1状态变为已完成,promise2必须成功执行并返回相同的值
* 如果onRejected不是函数且promise1状态变为已拒绝,promise2必须执行拒绝回调并返回相同的据因
*/
var promise1 = new Promise((resolve, reject) => {
reject();
});
promise1.then(null, function () {
return 123;
}).then(null, null).then(null, null).then(() => {
console.log('promise2 已完成');
}, () => {
console.log('promise2 已拒绝');
});
/**
* 上边等价于下边格式
* 解析:
* 1.首先调用Promise1的reject方法,第一个会执行第二个函数,返回123,它是一个合法的值
* 那么他就会进入onFulfilled 状态是一个Promise对象
* 2.Promise2就返回123,保存的onFulfilled状态
* 3.Promise3两个参数都不是函数被忽略,Promise3于是也保存的Promise2状态
* 4.同理Promise4也是保留Promise2的状态
* 5.于是Promise5接受onFulfilled状态打印'promise2 已完成'
*/
let Promise1 = new Promise((resolve, reject) => {
reject();
})
let Promise2 = Promise1.then(null, function () {
return 123;
})
let Promise3 = Promise2.then(null, null)
let Promise4 = Promise3.then(null, null)
let Promise5 = Promise4.then(() => {
console.log('promise2 已完成');
}, () => {
console.log('promise2 已拒绝');
})
promise解决的过程
/**
* Promise解决过程,是一个抽象的操作,其需输入一个promise和一个值,
* 我们表示为[[Resolve]](promise, x)
*/
var promise1 = function () {
return new Promise(function (resolve) {
setTimeout(function () {
console.log(1);
resolve();
}, 1000)
});
}
var promise2 = function () {
return new Promise(function (resolve) {
setTimeout(function () {
console.log(2);
resolve();
}, 2000);
});
}
promise1().then(function () {
return promise2(); // 此处返回一个 promise 实例
}).then(function() {console.log('已完成')}, function() {console.log('已拒绝')});
Promise静态方法
race方法
/**
*返回一个 promise 实例,接受一个数组,里面含有多个 promise 实例,
* 当有一个 promise 实例状态改变时,就进入该状态且不可改变。
* 这里所有的 promise 实例为竞争关系,只选择第一个进入改变状态的promise 的值。
* 执行结果:
* 1
* 已经有一个Promise状态改变了,1
* 2
*/
var promise1 = function () {
return new Promise(function (resolve) {
setTimeout(function () {
console.log(1);
resolve(1);
}, 1000)
});
}
var promise2 = function () {
return new Promise(function (resolve) {
setTimeout(function () {
console.log(2);
resolve(2);
}, 2000);
});
}
Promise.race([promise1(), promise2()]).then(function (val) {
console.log('有一个 promise 状态已经改变', val);
});
有一个代码状态发生改变,就立刻执行,并不是说另外一个Promise不执行中断,而是他的结果已经不重要了,立刻返回当前结果,所以上边代码还是会打印2,不过是在最后