黑龙江网站建设seo优化,做网站怎么申请域名,可以做公司网站,dedecms网站地图参考文章
Promise.all()
Promise.all()方法用于将多个 Promise 实例#xff0c;包装成一个新的 Promise 实例。
const p Promise.all([p1, p2, p3]);上面代码中#xff0c;Promise.all()方法接受一个数组作为参数#xff0c;p1、p2、p3都是 Promise 实例#xff0c;如果…参考文章
Promise.all()
Promise.all()方法用于将多个 Promise 实例包装成一个新的 Promise 实例。
const p Promise.all([p1, p2, p3]);上面代码中Promise.all()方法接受一个数组作为参数p1、p2、p3都是 Promise 实例如果不是就会先调用Promise.resolve方法将参数转为 Promise 实例再进一步处理。另外Promise.all()方法的参数可以不是数组但必须具有 Iterator 接口且返回的每个成员都是 Promise 实例。
p的状态由p1、p2、p3决定分成两种情况。
1只有p1、p2、p3的状态都变成fulfilledp的状态才会变成fulfilled此时p1、p2、p3的返回值组成一个数组传递给p的回调函数。
2只要p1、p2、p3之中有一个被rejectedp的状态就变成rejected此时第一个被reject的实例的返回值会传递给p的回调函数。
下面是一个具体的例子。
// 生成一个Promise对象的数组
const promises [2, 3, 5, 7, 11, 13].map(function (id) {return getJSON(/post/ id .json);
});Promise.all(promises).then(function (posts) {// ...
}).catch(function(reason){// ...
});上面代码中promises是包含 6 个 Promise 实例的数组只有这 6 个实例的状态都变成fulfilled或者其中有一个变为rejected才会调用Promise.all方法后面的回调函数。
下面是另一个例子。
const databasePromise connectDatabase();const booksPromise databasePromise
.then(findAllBooks);const userPromise databasePromise
.then(getCurrentUser);Promise.all([booksPromise,userPromise
]).then(([books, user]) pickTopRecommendations(books, user));上面代码中booksPromise和userPromise是两个异步操作只有等到它们的结果都返回了才会触发pickTopRecommendations这个回调函数。
注意如果作为参数的 Promise 实例自己定义了catch方法那么它一旦被rejected并不会触发Promise.all()的catch方法。
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: 报错了]上面代码中p1会resolvedp2首先会rejected但是p2有自己的catch方法该方法返回的是一个新的 Promise 实例p2指向的实际上是这个实例。该实例执行完catch方法后也会变成resolved导致Promise.all()方法参数里面的两个实例都会resolved因此会调用then方法指定的回调函数而不会调用catch方法指定的回调函数。
如果p2没有自己的catch方法就会调用Promise.all()的catch方法。
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: 报错了Promise.race()
Promise.race()方法同样是将多个 Promise 实例包装成一个新的 Promise 实例。
const p Promise.race([p1, p2, p3]);上面代码中只要p1、p2、p3之中有一个实例率先改变状态p的状态就跟着改变。那个率先改变的 Promise 实例的返回值就传递给p的回调函数。
Promise.race()方法的参数与Promise.all()方法一样如果不是 Promise 实例就会先调用Promise.resolve()方法将参数转为 Promise 实例再进一步处理。
下面是一个例子如果指定时间内没有获得结果就将 Promise 的状态变为reject否则变为resolve。
const p Promise.race([fetch(/resource-that-may-take-a-while),new Promise(function (resolve, reject) {setTimeout(() reject(new Error(request timeout)), 5000)})
]);p.then(console.log).catch(console.error);上面代码中如果 5 秒之内fetch方法无法返回结果变量p的状态就会变为rejected从而触发catch方法指定的回调函数。