- Promise的用途
√.Promise是一个对象,他代表了一个异步操作的最终完成或失败。
√.避免多重的异步操作,导致回调地域。
√.规范了名称
√.三种状态:pending(进行中)、fulfilled(已成功)、rejected(已失败),一旦pending→fulfilled或者pending→rejected状态改变,就会一直保持这个结果
√.Promise的两个参数resolve、reject是两个函数,有JS提供,他们在异步成功或者失败的时候被调用,然后将结果作为参数传递出去。
- 创建Promise
return new Promise((resolve,reject)=>{....})
- Promise.prototype.then()
var p = new Promise((resolve, reject) => {
resolve('成功!');
// or
// reject(new Error("出错了!"));
});
p.then(value => {
console.log(value); // 成功!
}, reason => {
console.error(reason); // 出错了!
});
then后面接受两个参数:Promise成功或失败的函数
- Promise.all()
语法:Promise.all(iterable);iterable为一个可迭代对象参数,Array或者String.
在任何情况下,Promise.all 返回的 promise 的完成状态的结果都是一个数组,它包含所有的传入迭代参数对象的值(也包括非 promise 值)。
let p1 = Promise.resolve(3);
let p2 = {id:37};
let p3 = new Promise((resolve, reject) => {
setTimeout(resolve, 100, 'foo');
});
Promise.all([p1, p2, p3]).then(values => {
console.log(values); // [3, {id:37}, "foo"]
});
失败/拒绝(Rejection): 如果传入的 promise 中有一个失败(rejected),Promise.all 异步地将失败的那个结果给失败状态的回调函数,而不管其它 promise 是否完成。
- Promise.race()
语法:Promise.all(iterable);iterable为一个可迭代对象参,类似Array
返回异步第一个完成的结果,可能是成功resolve,也可能是失败reject,
let p1 = new Promise(function(resolve, reject) {
setTimeout(resolve, 500, "one");
});
let p2 = new Promise(function(resolve, reject) {
setTimeout(resolve, 100, "two");
});
Promise.race([p1, p2]).then(function(value) {
console.log(value); // "two"
// 两个都完成,但 p2 更快
});
let p3 = new Promise(function(resolve, reject) {
setTimeout(resolve, 100, "three");
});
let p4 = new Promise(function(resolve, reject) {
setTimeout(reject, 500, "four");
});
Promise.race([p3, p4]).then(function(value) {
console.log(value); // "three"
// p3 更快,所以它完成了
}, function(reason) {
// 未被调用
});
let p5 = new Promise(function(resolve, reject) {
setTimeout(resolve, 500, "five");
});
let p6 = new Promise(function(resolve, reject) {
setTimeout(reject, 500, "six");
});
Promise.race([p5, p6]).then(function(value) {
console.log(value) //"five"
//两个时间一样,但p5排在p6前面
}, function(reason) {
console.log(reason);
});