Promise 有以下三个状态
待定(pending): 初始状态,既没有被兑现,也没有被拒绝。
已兑现(fulfilled): 意味着操作成功完成。
已拒绝(rejected): 意味着操作失败。
当Promise 如果没有执行resolve,reject 的函数的时候,则会一直处于pending状态,直到程序调用了 resolve 或者 reject的时候就会将状态更改为fullfilled状态.Promise的状态是不可逆的。
pending状态的例子
p1 = new Promise(function (resolve, reject) {
console.log("promise 开始");
});
fullfilled状态的例子
p1 = new Promise(function (resolve, reject) {
console.log("promise 开始"); //此时promise 处于pending状态
resolve();
});
console.log(p1);
//p1的状态为 fullfilled
rejected状态的例子
p1 = new Promise(function (resolve, reject) {
console.log("promise 开始");
//此时promise 处于pending状态 reject("成功调用"); }); console.log(p1);
//p1的状态为 rejected
1.函数的终止状态决定着链式调用中下一个promise的"已敲定 (settled)"状态是什么。任何不是 throw 的终止都会创建一个"已决议(resolved)"状态,而以 throw 终止则会创建一个"已拒绝"状态
2.catch 函数可以理解为输出错误信息的then,只是比then少了一个参数。
3.被返回的 nextValue 可能是另一个promise对象,这种情况下这个promise会被动态地插入链式调用。
静态方法
Promise.all(iterable)
这个方法返回一个新的promise对象,该promise对象在iterable参数对象里所有的promise对象都成功的时候才会触发成功,一旦有任何一个iterable里面的promise对象失败则立即触发该promise对象的失败
两次返回成功的例子
var time = new Date().getTime();
var getDiffTime = () => {
return new Date().getTime() - time;
};
p1 = new Promise(function (resolve, reject) {
setTimeout(function () {
console.log("p1 执行成功", getDiffTime() + "ms");
resolve("p1返回");
}, 2000);
});
p2 = new Promise(function (resolve, reject) {
setTimeout(function () {
console.log("p2 执行成功", getDiffTime() + "ms");
resolve("p2返回");
}, 5000);
});
p3 = Promise.all([p1, p2]).then(data => {
console.log(data, getDiffTime() + "ms");
});
//返回的结果
//p1 执行成功 2001ms
//p2 执行成功 5001ms
//['p1返回', 'p2返回'] 5001ms
两次返回其中一次较早返回失败的例子
/* jshint esversion: 6 */
var time = new Date().getTime();
var getDiffTime = () => {
return new Date().getTime() - time;
};
p1 = new Promise(function (resolve, reject) {
setTimeout(function () {
console.log("p1 执行成功", getDiffTime() + "ms");
reject("p1返回失败");
}, 2000);
});
p2 = new Promise(function (resolve, reject) {
setTimeout(function () {
console.log("p2 执行成功", getDiffTime() + "ms");
resolve("p2返回成功");
}, 5000);
});
p3 = Promise.all([p1, p2]).then(data => {
console.log(data, getDiffTime() + "ms");
}).catch(data => {
console.log(data, getDiffTime() + "ms");
});
//返回的结果
//p1 执行成功 2002ms
//p1返回失败 2009ms
//p2 执行成功 5002ms
Promise.any
Promise.any() 接收一个Promise可迭代对象,只要其中的一个 promise 成功,就返回那个已经成功的 promise 。如果可迭代对象中没有一个 promise 成功(即所有的 promises 都失败/拒绝),就返回一个失败的 promise 和AggregateError类型的实例
两个值有一个返回成功的样例,并且后返回成功的样例
/* jshint esversion: 6 */
var time = new Date().getTime();
var getDiffTime = () => {
return new Date().getTime() - time;
};
p1 = new Promise(function (resolve, reject) {
setTimeout(function () {
console.log("p1 执行失败", getDiffTime() + "ms");
reject("p1返回失败");
}, 2000);
});
p2 = new Promise(function (resolve, reject) {
setTimeout(function () {
console.log("p2 执行成功", getDiffTime() + "ms");
resolve("p2返回成功");
}, 5000);
});
p3 = Promise.any([p1, p2]).then(data => {
console.log('p3 成功', data, getDiffTime() + "ms");
}).catch(data => {
console.log('p3 失败', data, getDiffTime() + "ms");
});
//执行结果
//p1 执行失败 2000ms
// p2 执行成功 5001ms
// p3 成功 p2返回成功 5002ms
带有普通字符串变量的样例
/* jshint esversion: 6 */
var time = new Date().getTime();
var getDiffTime = () => {
return new Date().getTime() - time;
};
p1 = new Promise(function (resolve, reject) {
setTimeout(function () {
console.log("p1 执行成功", getDiffTime() + "ms");
resolve("p1返回成功");
}, 2000);
});
p2 = new Promise(function (resolve, reject) {
setTimeout(function () {
console.log("p2 执行成功", getDiffTime() + "ms");
resolve("p2返回成功");
}, 5000);
});
p3 = Promise.all([p1, 'hahahah', p2]).then(data => {
console.log(data, getDiffTime() + "ms");
}).catch(data => {
console.log(data, getDiffTime() + "ms");
});
//返回的结果
//p1 执行成功 2002ms
//p2 执行成功 5002ms
//[ 'p1返回成功', 'hahahah', 'p2返回成功' ] 5002ms
都返回错误样例
/* jshint esversion: 6 */
var time = new Date().getTime();
var getDiffTime = () => {
return new Date().getTime() - time;
};
p1 = new Promise(function (resolve, reject) {
setTimeout(function () {
console.log("p1 执行失败", getDiffTime() + "ms");
reject("p1返回失败");
}, 2000);
});
p2 = new Promise(function (resolve, reject) {
setTimeout(function () {
console.log("p2 执行失败", getDiffTime() + "ms");
reject("p2返回失败");
}, 5000);
});
p3 = Promise.any([p1, p2]).then(data => {
console.log('p3 成功', data, getDiffTime() + "ms");
}).catch(data => {
console.log('p3 失败', data, getDiffTime() + "ms");
});
//返回的结果
//p1 执行失败 2001ms
//p2 执行失败 5001ms
//p3 失败 AggregateError: All promises were rejected 5002ms
Promise.race
当iterable参数里的任意一个子promise被成功或失败后,父promise马上也会用子promise的成功返回值或失败详情作为参数调用父promise绑定的相应句柄,并返回该promise对象。
执行失败的案例
/* jshint esversion: 6 */
var time = new Date().getTime();
var getDiffTime = () => {
return new Date().getTime() - time;
};
p1 = new Promise(function (resolve, reject) {
setTimeout(function () {
console.log("p1 执行失败", getDiffTime() + "ms");
reject("p1返回失败");
}, 2000);
});
p2 = new Promise(function (resolve, reject) {
setTimeout(function () {
console.log("p2 执行失败", getDiffTime() + "ms");
reject("p2返回失败");
}, 5000);
});
p3 = Promise.race([p1, p2]).then(data => {
console.log('p3 成功', data, getDiffTime() + "ms");
}).catch(data => {
console.log('p3 失败', data, getDiffTime() + "ms");
});
//执行的结果
//p1 执行失败 2001ms
//p3 失败 p1返回失败 2011ms
//p2 执行失败 5002ms
执行成功的案例
/* jshint esversion: 6 */
var time = new Date().getTime();
var getDiffTime = () => {
return new Date().getTime() - time;
};
p1 = new Promise(function (resolve, reject) {
setTimeout(function () {
console.log("p1 执行成功", getDiffTime() + "ms");
resolve("p1返回成功");
}, 2000);
});
p2 = new Promise(function (resolve, reject) {
setTimeout(function () {
console.log("p2 执行成功", getDiffTime() + "ms");
resolve("p2返回成功");
}, 5000);
});
p3 = Promise.race([p1, p2]).then(data => {
console.log('p3 成功', data, getDiffTime() + "ms");
}).catch(data => {
console.log('p3 失败', data, getDiffTime() + "ms");
});
//执行的结果
//p1 执行成功 2000ms
//p3 成功 p1返回成功 2010ms
//p2 执行成功 5000ms
Promise.reject
返回一个状态为失败的Promise对象,并将给定的失败信息传递给对应的处理方法
实例
p1 = new Promise(function (resolve, reject) {
resolve("p1返回成功");
}).then(data => {
return Promise.resolve("执行成功").then(data => {
console.log("执行成功的then");
return Promise.reject("执行失败");
});
}).then(data => {
console.log("success", data);
}).catch(data => {
console.log("error", data);
});
//执行的结果
//执行成功的then
//error 执行失败
Project.resolve
返回一个状态由给定value决定的Promise对象。如果该值是thenable(即,带有then方法的对象),返回的Promise对象的最终状态由then方法执行决定;否则的话(该value为空,基本类型或者不带then方法的对象),返回的Promise对象状态为fulfilled,并且将该value传递给对应的then方法。通常而言,如果您不知道一个值是否是Promise对象,使用Promise.resolve(value) 来返回一个Promise对象,这样就能将该value以Promise对象形式使用。
实例
/* jshint esversion: 6 */
p1 = new Promise(function (resolve, reject) {
resolve("p1返回成功");
}).then(data => {
return Promise.resolve("执行成功").then(data => {
console.log("执行成功的then");
return Promise.resolve("执行成功");
});
}).then(data => {
console.log("success", data);
}).catch(data => {
console.log("error", data);
});
//执行的结果
//执行成功的then
//success 执行成功