关于promise:如何使用Promiseall

63次阅读

共计 2493 个字符,预计需要花费 7 分钟才能阅读完成。

什么是 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…

正文完
 0