ES6 Promise 对象
我们结核实例来说明Promise的一些特点
1. Promise 内部的错误不会影响到 Promise 外部的代码,通俗的说法就是“Promise 会吃掉错误”
const asyncThing = function() {
return new Promise(function(resolve, reject) {
// 下面一行会报错,因为x没有声明
resolve(x + 2);
});
};
asyncThing().then(function() {
console.log('everything is great');
});
setTimeout(() => { console.log(123) }, 2000);
// Uncaught (in promise) ReferenceError: x is not defined
// 123
2. Promise.all([pro1, pro2,...])
接收一个promise实例的集合。执行回调then的两个情况:
只有promise实例集合状态都变成fulfilled, 或 其中一个被regected 返回值才会传给promise.all()的回调函数。
一个关于promise.all 的特殊例子:
const p1 = new Promise((resolve, reject) => {
resolve('hello');
})
.then(result => result)
.catch(e => e);
const p2 = new Promise((resolve, reject) => {
throw new Error('报错了');
})
.then(result => result)
.catch(e => e);
Promise.all([p1, p2])
.then(result => console.log(result))
.catch(e => console.log(e));
// ["hello", Error: 报错了]
p2有自己的catch,当期内有异常时已被自己的catch捕获,然后返回一个新的promise 对象。 此时对promise.all 来说,p2状态也是resolved。 所以最终没有走promise.all() 的catch
但是如果把p2 的promise catch 去掉则p2将被返回rejected. 如下代码:
const p1 = new Promise((resolve, reject) => {
resolve('hello');
})
.then(result => result);
const p2 = new Promise((resolve, reject) => {
throw new Error('报错了');
})
.then(result => result);
Promise.all([p1, p2])
.then(result => console.log(result))
.catch(e => console.log(e));
// Error: 报错了
待续中........