初学者应该看的JavaScript Promise 完整指南( 三 )


const axIOS = require('axios');const bitcoinPromise = axios.get('https://api.coinpaprika.com/v1/coins/btc-bitcoin/markets');const dollarPromise = axios.get('https://api.exchangeratesapi.io/latest?base=USD');const currency = 'EUR';// Get the price of bitcoins onPromise.all([bitcoinPromise, dollarPromise])  .then(([bitcoinMarkets, dollarExchanges]) => {    const byCoinbaseBtc = d => d.exchange_id === 'coinbase-pro' && d.pair === 'BTC/USD';    const coinbaseBtc = bitcoinMarkets.data.find(byCoinbaseBtc)    const coinbaseBtcInUsd = coinbaseBtc.quotes.USD.price;    const rate = dollarExchanges.data.rates[currency];    return rate * coinbaseBtcInUsd;  })  .then(price => console.log(`The Bitcoin in ${currency} is ${price.toLocaleString()}`))  .catch(console.log)如你所见,Promise.all接受了一系列的 Promises 。当两个请求的请求都完成后,我们就可以计算价格了 。
我们再举一个例子:
const a = () => new Promise((resolve) => setTimeout(() => resolve('a'), 2000));const b = () => new Promise((resolve) => setTimeout(() => resolve('b'), 1000));const c = () => new Promise((resolve) => setTimeout(() => resolve('c'), 1000));const d = () => new Promise((resolve) => setTimeout(() => resolve('d'), 1000));console.time('promise.all');Promise.all([a(), b(), c(), d()])  .then(results => console.log(`Done! ${results}`))  .catch(console.error)  .finally(() => console.timeEnd('promise.all'));解决这些 Promise 要花多长时间?5秒?1秒?还是2秒?
这个留给你们自己验证咯 。
Promise racePromise.race(iterable) 方法返回一个 promise,一旦迭代器中的某个promise解决或拒绝,返回的 promise就会解决或拒绝 。
const a = () => new Promise((resolve) => setTimeout(() => resolve('a'), 2000));const b = () => new Promise((resolve) => setTimeout(() => resolve('b'), 1000));const c = () => new Promise((resolve) => setTimeout(() => resolve('c'), 1000));const d = () => new Promise((resolve) => setTimeout(() => resolve('d'), 1000));console.time('promise.race');Promise.race([a(), b(), c(), d()])  .then(results => console.log(`Done! ${results}`))  .catch(console.error)  .finally(() => console.timeEnd('promise.race'));输出是什么?
输出 b 。使用 Promise.race,最先执行完成就会结果最后的返回结果 。
你可能会问:Promise.race的用途是什么?
我没胡经常使用它 。但是,在某些情况下,它可以派上用场,比如计时请求或批量处理请求数组 。
Promise.race([  fetch('http://slowwly.robertomurray.co.uk/delay/3000/url/https://api.jsonbin.io/b/5d1fb4dd138da811182c69af'),  new Promise((resolve, reject) => setTimeout(() => reject(new Error('request timeout')), 1000))]).then(console.log).catch(console.error);

初学者应该看的JavaScript Promise 完整指南

文章插图
 
如果请求足够快,那么就会得到请求的结果 。
初学者应该看的JavaScript Promise 完整指南

文章插图
 
1.5 Promise 常见问题串行执行 promise 并传递参数这次,我们将对Node的fs使用promises API,并将两个文件连接起来:
const fs = require('fs').promises; // requires node v8+fs.readFile('file.txt', 'utf8')  .then(content1 => fs.writeFile('output.txt', content1))  .then(() => fs.readFile('file2.txt', 'utf8'))  .then(content2 => fs.writeFile('output.txt', content2, { flag: 'a+' }))  .catch(error => console.log(error));


推荐阅读