24.7 组合
本节讲述了如何将已有的 Promise 组合起来创建新的 Promise 。我们已经遇到了一种组合 Promise 的方法:通过 then()
依次链式连接。 Promise.all()
和 Promise.race()
提供了另外的组合方式。
24.7.1 map()
与 Promise.all()
结合
关于 Promise 一件很好的事情就是很多同步的工具仍然有效,因为基于 Promise 的函数有返回结果。例如,可以使用数组方法 map()
:
let fileUrls = [
'http://example.com/file1.txt',
'http://example.com/file2.txt'
];
let promisedTexts = fileUrls.map(httpGet);
promisedTexts
是一组 Promise 。 Promise.all()
用一个 Promise 数组(可 then 化的和其它值都通过 Promise.resolve()
被转换成了 Promise )作为参数,一旦所有的 Promise 都成功完成了,它就变为 fulfilled 状态,返回结果是这组 Promise 的返回结果的一个数组:
Promise.all(promisedTexts)
.then(texts => {
for (let text of texts) {
console.log(text);
}
})
.catch(reason => {
// Receives first rejection among the Promises
});
24.7.2 利用 Promise.race()
实现超时
Promise.race()
使用一个 Promise 数组(可 then 化的和其它值都通过 Promise.resolve()
被转换成了 Promise )作为参数,然后返回一个 Promise P 。传入的 Promise 数组中只要有一个 Promise 变为稳定状态,就会将稳定状态信息传递给返回的那个 Promise P 。
让我们使用 Promise.race()
实现超时:
Promise.race([
httpGet('http://example.com/file.txt'),
delay(5000).then(function () {
throw new Error('Timed out')
});
])
.then(function (text) { ··· })
.catch(function (reason) { ··· });