什么是 Promise
Promise 是一个对象,它代表了一个异步操作的最终实现或者失败及其后果值。简略地说,Promise是一个示意当前某个时候会生成的值的占位符。
Promise 是解决异步操作的十分有用的对象。
JavaScript 提供了一个帮忙函数 Promise.all(promisesArrayOrIterable)
反对并行处理多个Promises,并且在一个聚合数组中获取后果值。我么一起来学习下Promise.all()是怎么工作的。
1.Promise.all()
Promise.all() 是内置的帮忙函数可能承受promise数组,函数返回的格局如下:
const allPromise = Promise.all([promise1, promise2, ...]);
而后能够应用 then-able 语法提取Promise返回的值:
`allPromise.then(values => {
values; // [valueOfPromise1, valueOfPromise2, ...]
}).catch(error => {
error; // rejectReason of any first rejected promise
});`
或者应用async/await 语法:
`try {
const values = await allPromise;
values; // [valueOfPromise1, valueOfPromise2, ...]
} catch (error) {
error; // rejectReason of any first rejected promise
}`
最有用的是Promise 能够通过 Promise.all() 获取resolved 或rejected
如果所有的promise对象申请胜利了,那么 allPromise 是由Promise 组成的数组。Promises的返回程序与入数组栈的程序无关。
然而如果最初一个promise reject了,allPromise 也将会进入 reject状态,不会期待其余的promises 被正确返回。
同时执行异步操作示例
为了演示Promise.all() 的工作流程,咱们抉择应用2个帮忙类,resolveTimeout(value, delay) and rejectTimeout(reason, delay).
`function resolveTimeout(value, delay) {
return new Promise(
resolve => setTimeout(() => resolve(value), delay)
);
}
function rejectTimeout(reason, delay) {
return new Promise(
(r, reject) => setTimeout(() => reject(reason), delay)
);
}`
resolveTimeout(value, delay) 返回一个Promise对象并携带一个参数值
另外,rejectTimeout,也将返回一个Promise对象,并携带回绝的理由。
如模仿示例,在同一时间商店提供蔬菜和水果的列表,并且通过异步操作来拜访每个列表:
`const allPromise = Promise.all([
resolveTimeout(['potatoes', 'tomatoes'], 1000),
resolveTimeout(['oranges', 'apples'], 1000)
]);
// wait...
const lists = await allPromise;
// after 1 second
console.log(lists);
// [['potatoes', 'tomatoes'], ['oranges', 'apples']]`
const allPromise = Promise.all([...]) 返回新的allPromise的promise对象。
const lists = await allPromise 语句申明了期待1秒钟,直到所有的promise对象压入allpromise 数组中。
最初list中输入的后果为:[['potatoes', 'tomatoes'], ['oranges', 'apples']].
promises 数组的程序间接影响后果的程序。
蔬菜的promises是第一项,而水果的promises是输出数组中的第二项。后果数组蕴含雷同程序的值--第一个蔬菜列表和第二个水果列表。
3. 示例: 当一个Promise 产生阻塞时
当初设想一下这样的状况:杂货店里没有水果了。在这种状况下,让咱们用一个谬误提醒返回水果的reject: new Error('Out of fruits!'):
`const allPromise = Promise.all([
resolveTimeout(['potatoes', 'tomatoes'], 1000),
rejectTimeout(new Error('Out of fruits!'), 1000)
]);
try {
// wait...
const lists = await allPromise;
} catch (error) {
// after 1 second
console.log(error.message); // 'Out of fruits!'
}`
在这种状况下,allPromise = Promise.all([...]),返回一个promise,然而, 当promise(fruits)返回一个谬误new Error('Out of fruits!')所有的allpromise 对象也将返回reject 办法,并返回同样的谬误。
即便蔬菜的promise曾经实现了,Promise.all() 并不失效。Promise.all([...])的行为即 fail-fast. 如果队列中有一个 promise reject,其余的promise也是reject并且返回同样的理由。
4. 总结
Promise.all([...])是一个有用的辅助函数,它能够让你应用故障疾速策略并行地执行异步操作,并将后果聚合到一个数组中。
原文地址:https://dmitripavlutin.com/pr...