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) { ··· });

results matching ""

    No results matching ""